1

我正在尝试编译一个库,其中包含来自 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
4

1 回答 1

2

问题的根源在于您使用的头文件<asm-generic/fls64.h>是内部内核实现的一部分,根本不打算由用户空间使用。事实上,即使在内核中,这个头文件也应该被包含在头文件中,arch/XXX/include/bitops.h以提供fls64()基于fls()架构特定代码中定义的通用实现。

换句话说,这个库有一个问题,它依赖于内核内部,这些内核内部并没有真正导出到用户空间使用,因此可能会因各种内核版本而中断;该库可能已经针对某些较旧的内核构建了 OK,但这只是运气。

正确的解决方法实际上是让库提供自己的 fls64 定义,而不是依赖于幸运地发现某些随机版本的内核头文件碰巧偶然定义了。

于 2011-05-23T19:35:36.560 回答