2011-05-20 94 views
1

我想編譯一個包含kernel-devel軟件包頭文件的庫。我鏈接了合適的頭文件,但現在我在這些頭文件中出現編譯錯誤。Linux內核頭文件錯誤

/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-通用/ 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_ */ 

正如你所看到的代碼 「返回FLS(H)」,有沒有FLS的定義()。我可以通過包含「fls.h」來解決這個問題,但是我想在標準內核頭文件中解決這些錯誤?

任何指針,可以解釋爲什麼這樣,我能做些什麼來解決這些問題?順便說一句,我在這裏提到的錯誤只是冰山一角。在多個這樣的頭文件中有很多這樣的(缺失解碼)錯誤。

幫助將不勝感激。謝謝!

rgds/R。

PS:有些系統的詳細信息:

Linux發行版:CentOS的(5.5)

[[email protected] 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 

[[email protected] common]$ cat /proc/version 
Linux version 2.6.18-238.9.1.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Tue Apr 12 18:10:56 EDT 2011 
+0

請發佈更多來自編譯器的輸出。真正的錯誤可能在您引用的摘錄之上。 – 2011-05-20 08:46:38

+0

羅賓,我沒有發佈更多,因爲我認爲這是無關緊要的。我擔心的是我認爲一個標準的Linux頭文件fls64.h正在使用一個沒有定義的函數。這是正常的嗎? – Raj 2011-05-20 12:13:37

+0

我認爲這也取決於如何配置內核。代碼是標準的,但配置可能有1000或更多的可能性。 – Jiang 2011-05-20 21:35:35

回答

2

問題的根源是,你用的是頭文件<asm-generic/fls64.h>是內部內核實現的一部分並不打算被用戶空間使用。事實上,即使在內核中,這個頭文件也應該包含在arch/XXX/include/bitops.h之類的頭文件中,以提供基於體系結構特定代碼中定義的fls()fls64()的通用實現。

換句話說,這個庫有一個問題,它依賴於內核內部,它並不真正導出到用戶空間以供使用,因此可能會因各種內核版本而中斷;圖書館可能已經建立了對一些舊的內核確定,但這只是運氣。

正確的修復方法實際上是爲圖書館提供自己的fls64定義,而不是依賴於某些隨機版本的內核頭文件偶然定義的幸運。

+0

感謝羅蘭,你有一個點! – Raj 2011-05-24 12:23:01

+0

Roland,請告訴我如何確定哪個文件在整個嵌套包含中包含某個.h文件?實際上,我的庫不直接包含這個fls64.h。我想知道這包括在哪裏。我正在使用gcc。 – Raj 2011-05-24 13:13:06

+0

當報告錯誤時,gcc是否會告訴你包含鏈?就像「在從/ a/b/c包含/ from/a/b/c從/ e/f/g ...包含的文件... fls not declared」 – Roland 2011-05-24 17:24:27