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_MUTEX
为 sema_init
即可, 也可以在驱动中定义 init_MUTEX
- 修改
init_MUTEX
为sema_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_MUTEX
为sema_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_MUTEX
为 sema_init
是没有什么问题的.
-
本作品/博文 ( AderStep-紫夜阑珊-青伶巷草 Copyright ?2013-2017 ), 由 成坚(gatieme) 创作,
-
采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme/article/details/71598127 ), 不得用于商业目的,
-
基于本文修改后的作品务必以相同的许可发布. 如有任何疑问,请与我联系.