我试图编译一个库,其中包含一些来自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”来解决这个问题,但我是否可以在标准内核头文件中修复这些错误?是吗?
任何能解释为什么会这样的指针,我能做些什么来解决这些问题??顺便说一下,我在这里提到的错误只是冰山一角。在多个这样的头中有很多这样的错误(缺少delcaration)。
我们将非常感谢您的帮助。谢谢!
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

最佳答案

问题的根源在于您使用的头文件<asm-generic/fls64.h>是内部内核实现的一部分,根本不打算由用户空间使用。事实上,即使在内核中,这个头文件也应该包含在arch/XXX/include/bitops.h这样的头文件中,以便基于特定于体系结构的代码中定义的fls64()提供fls()的通用实现。
换言之,这个库有一个问题,它依赖于内核内部,这些内核内部并没有真正导出到用户空间中使用,因此对于不同的内核版本可能会中断;这个库很可能已经针对一些较旧的内核构建好了,但这只是运气。
正确的修复方法是让库提供自己的fls64定义,而不是依赖偶然定义的内核头的随机版本。

关于linux - Linux内核 header 中的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6069469/

10-16 11:23