linux - Linux 内核 header 中的错误

标签 linux gcc linux-kernel compilation centos5

我正在尝试编译一个库,其中包含一些来自 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”来解决这个问题,但我应该在标准内核头文件中修复此类错误吗??

任何可以解释为什么会这样的指示以及我可以做些什么来解决这些问题?顺便说一句,我在这里提到的错误只是冰山一角。多个此类 header 中存在很多此类(缺少声明)错误。

帮助将不胜感激。谢谢!

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()在特定于体系结构的代码中定义。

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

正确的修复方法实际上是让库提供自己的 fls64 定义,而不是依靠运气来偶然定义一些随机版本的内核头文件。

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

相关文章:

c++ - 一段时间后 CPU 使用率高

在 Notepad++ 中配置 NppExec 以进行 C 编程

c - 在 Linux 中构建 PLX SDK 驱动程序产生 "No such file or directory"

c - 打印当前进程的打开文件

c++ - 将 "No known conversion"作为参数传递时来自 const 的 "this"

amazon-ec2 - 如何在 AWS 实例中设置 telnet?

linux - zssh 无法启动并在启动时显示 "out of pty' s"

linux - Linux shell 表达式中的变量

linux - 如何在 linux 中递归重命名目录和子目录?

c++ - Solaris 上的 GCC - 在 `0x00000002' 之前解析错误