当前位置: 代码迷 >> 综合 >> 解决error: implicit declaration of function ‘init_MUTEX’)
  详细解决方案

解决error: implicit declaration of function ‘init_MUTEX’)

热度:97   发布时间:2023-12-18 11:58:47.0

init_MUTEX被废除(解决error: implicit declaration of function ‘init_MUTEX’)

2017年05月10日 22:12:45 JeanCheng 阅读数:2763

版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme https://blog.csdn.net/gatieme/article/details/71598127

CSDN GitHub
init_MUTEX被废除
解决error: implicit declaration of function ‘init_MUTEX’
LDD/problem/port/init_MUTEX



本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处
 

1 问题


近期在移植驱动的时候, 提示了如下错误

error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]

2 原因分析


2.6.37 之后的 Linux 内核中, init_mutex 已经被废除了, 新版本使用 sema_init 函数

查了一下早期版本的定义, 参见include/linux/semaphore.h, version 2.6.36.4, line 42

static inline void sema_init(struct semaphore *sem, int val)
{static struct lock_class_key __key;*sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0);
}#define init_MUTEX(sem)     sema_init(sem, 1)
#define init_MUTEX_LOCKED(sem)  sema_init(sem, 0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3 解决方案


修改 init_MUTEXsema_init即可, 也可以在驱动中定义 init_MUTEX

  • 修改 init_MUTEXsema_init
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) && !defined(init_MUTEX)sema_init(&sem, 1);
#elseinit_MUTEX(&sem);
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 定义 init_MUTEXsema_init
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) && !defined(init_MUTEX)
#define init_MUTEX(sem)     sema_init(sem, 1)
#endif
  • 1
  • 2
  • 3

其实早期的内核中, 定义了 sema_init, 因此其实可以不需要添加 #if #endif 宏, 直接修改 init_MUTEXsema_init 是没有什么问题的.

 

  • 本作品/博文 ( AderStep-紫夜阑珊-青伶巷草 Copyright ?2013-2017 ), 由 成坚(gatieme) 创作,

  • 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme/article/details/71598127 ), 不得用于商业目的,

  • 基于本文修改后的作品务必以相同的许可发布. 如有任何疑问,请与我联系.

  相关解决方案