2012-12-14 74 views
4

我想編譯gtk棧(最後一個gtk2版本,2.24),並且我得到了一堆看起來相關的錯誤。即,不能從string.h和time.h中找到__locale_t,並且找不到LC_ALL_MASK(應該在locale.h中)。__USE_XOPEN2K8的用途以及如何設置它?

我發現所有這些問題都與__USE_XOPEN2K8未被#defined相關。什麼是__USE_XOPEN2K8,我該如何設置它的屬性?

例如,我是否必須將一個標誌傳遞給./configure for glib,gtk,...或者我是否必須在構建gcc或glib時更改某些東西c?我寧願不把#define __USE_XOPEN2K8灑在我的消息來源中,而不知道它的作用。注意我使用安裝在非標準前綴中的gcc-4.6.3和glibc-2.16.0,因爲我試圖讓gtk庫在僅包含舊版本的舊版CentOS(5.8)上工作。

還注意到在幾個地方例如__locale_t中提及缺少__locale_tthis bugreport。我可以在某些文件中添加#include <xlocale.h>,但似乎正確的解決方案是獲取__USE_XOPEN2K8


編輯:我發現this thread描述的問題。顯然,主機系統的頭文件會被「fixincluded」到新編譯器的頭文件中。鏈接的帖子建議編輯features.h。有誰知道我是否必須事後重新編譯gcc/glibc(以及如何讓它獲得新的features.h,而不是覆蓋它)?

+0

根據您所包含的鏈接,問題在於,當您構建gcc時,它會創建系統C庫頭文件的副本,而不是自定義glibc中的頭文件。關鍵是將gcc構建指向你的glibc構建。可悲的是,我並不完全知道該怎麼做,否則我會發表一個答案。看看gcc的配置選項,'--oldincludedir'或'--with-build-sysroot' *可能會朝着正確的方向發展,但我主要是猜測。 – rra

回答

5

__USE_GNU定義,__USE_XOPEN2K8始終定義,除非你 明確定義的未定義或這些宏,你必須這樣做。 使用_GNU_SOURCE,_XOPEN_SOURCE {500,600,700,...}等宏包含 之前的第一個頭。這是在glibc頭文件中選擇GNU功能集的建議方法,並在命令行中定義它(-D_GNU_SOURCE)。

或者,您可以嘗試通過-std命令行開關(gnu89,gnu99等)向gcc指定GNU擴展使用情況。

0

正如我知道當我們使用編譯器時,它的行爲取決於一些ENV宏,它們保存在feature.h中。所以你可以通過modifyinfg來配置你的編譯器。 Fisrt,您需要使用g++ -E youfile > log,查看您的編譯器使用哪個feature.h文件,然後使用g++ -E -dM /path/to/feature.h>log來查找__USE_XOPEN2K8,如果找不到它。在文件的末尾添加#define __USE_XOPEN2K8 1。您可能會在安裝編譯器時做某些配置錯誤。

3

在CentOS7用gcc 4.6,我們不得不使用-D_XOPEN_SOURCE = 700 -D__USE_XOPEN2K8

1

glibc的__USE_ *宏是用來實現特徵選擇內部宏。設置它們支持的方法是定義功能測試宏如-D_GNU_SOURCE:因爲glibc的支持多種標準和GNU擴展

需要這些宏,而這些功能都與每個衝突其他,主要是由於缺乏C中的名稱空間。例如,C和POSIX允許您定義一個名爲secure_getenv的全局變量(因爲標識符未被保留或以其他方式被這些標準使用),但是這樣的程序將不起作用您編譯_GNUS_SOURCE幷包括<stdlib.h>,因爲glibc pr包含稱爲secure_getenv的功能。

<xlocale.h>是一個內部glibc頭文件(頭文件中的註釋如此說明),並且在glibc 2.26中不再可用。

相關問題