我正在尝试编译一个包含kernel-devel包中的一些头文件的库。我链接了相应的标题,但现在我在这些标题文件中出现了编译错误。
/usr/include/asm-generic/bitops/fls64.h: In function ‘int fls64(__u64)’:
/usr/include/asm-generic/bitops/fls64.h:10: error: ‘fls’ was not declared in this scope
/usr/include/asm-generic/bitops/fls64.h:11: error: ‘fls’ was not declared in this scope
以下是asm-generic / bitops / fls64.h的代码
#ifndef _ASM_GENERIC_BITOPS_FLS64_H_
#define _ASM_GENERIC_BITOPS_FLS64_H_
#include <asm/types.h>
static inline int fls64(__u64 x)
{
__u32 h = x >> 32;
if (h)
return fls(h) + 32;
return fls(x);
}
#endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */
你可以注意到“return fls(h)”,没有fls()的定义。我可以通过包含“fls.h”解决这个问题,但我想在标准内核头文件中修复这些错误吗?
任何指针都可以解释为什么会这样,我该怎么办才能解决这些问题?顺便说一下,我在这里提到的错误只是冰山一角。多个这样的标题中有很多这样的(退出遗漏)错误。
非常感谢帮助。谢谢!
RGDS / R
PS:一些系统细节:
Linux发行版:CentOS(5.5)
[raj@localhost common]$ uname -a
Linux localhost.localdomain 2.6.18-238.9.1.el5 #1 SMP Tue Apr 12 18:10:56 EDT 2011 i686 i686 i386 GNU/Linux
[raj@localhost common]$ cat /proc/version
Linux version 2.6.18-238.9.1.el5 (mockbuild@builder10.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Tue Apr 12 18:10:56 EDT 2011
答案 0 :(得分:2)
问题的根源在于您使用的头文件<asm-generic/fls64.h>
是内部内核实现的一部分,并不打算由用户空间使用。实际上即使在内核中,这个头文件也应该被arch/XXX/include/bitops.h
这样的头包含在内,以基于特定于体系结构的代码中定义的fls64()
提供fls()
的通用实现。 / p>
换句话说,库存在一个问题,即它依赖于实际上没有导出到用户空间以供使用的内核内部,因此可能会因各种内核版本而中断;该库可能已经针对一些较旧的内核构建好了,但这只是运气。
正确的解决方法是让库提供自己的fls64定义,而不是依赖于一些随机版本的内核头文件偶然定义的幸运。