Gcc _uuu使用_XOPEN2K8的目的以及如何设置?

Gcc _uuu使用_XOPEN2K8的目的以及如何设置?,gcc,glibc,Gcc,Glibc,我正在尝试编译gtk堆栈(最后一个gtk2版本,2.24),我得到了一堆似乎相关的错误。也就是说,无法从string.h和time.h中找到\u locale\u t,也无法找到LC\u ALL\u MASK(应该在locale.h中) 我发现所有这些问题都与未定义的\uuuuxOpen2K8有关。什么是\u\u使用\u XOPEN2K8,如何对其进行属性设置 例如,我是否必须将标志传递给./configure For glib、gtk等。。。或者,在构建gcc或glibc时,我是否必须更改某些

我正在尝试编译gtk堆栈(最后一个gtk2版本,2.24),我得到了一堆似乎相关的错误。也就是说,无法从string.h和time.h中找到
\u locale\u t
,也无法找到
LC\u ALL\u MASK
(应该在locale.h中)

我发现所有这些问题都与未定义的
\uuuuxOpen2K8
有关。什么是
\u\u使用\u XOPEN2K8
,如何对其进行属性设置

例如,我是否必须将标志传递给./configure For glib、gtk等。。。或者,在构建gcc或glibc时,我是否必须更改某些内容?我不想在不知道它的功能的情况下将
#define uu u u u XOPEN2K8
加入到我的源代码中。注意,我使用的是安装在非标准前缀中的gcc-4.6.3和glibc-2.16.0,因为我试图让gtk库在只包括旧版本的旧CentOS(5.8)上工作

另请注意,有几个地方提到了缺少的
\uuu locale\u t
,例如。我可以在一些文件中添加
#include
,但似乎正确的解决方案是设置
uu USE\uxopen2k8



编辑:我找到了描述问题的方法。显然,主机系统的头被“包含”到新编译器的头中。链接的帖子建议编辑功能。有人知道我以后是否需要重新编译gcc/glibc(以及如何让它获取新特性.h,而不是覆盖它)?

当定义了
\u USE\u GNU
时,除非您 正在显式定义或取消定义这些宏,您不能这样做。 使用
\u GNU_SOURCE
\u XOPEN_SOURCE{500600700,…}
等宏,然后再包括 而是第一个标题。这是在glibc头中选择GNU功能集并在命令行上定义它的推荐方法(
-D_GNU_SOURCE


或者,您可以尝试通过
-std
命令行开关(
gnu89
gnu99
,等等)将GNU扩展用法指定给gcc。

正如我所知,当我们使用编译器时,它的行为取决于某些保存在
feature.h
中的ENV宏。因此,您可以通过修改编译器来配置编译器。
首先,您需要使用
g++-E youfile>log
,查看编译器使用的
feature.h
文件,然后使用
g++-E-dM/path/to/feature.h>log
,如果找不到
\u use XOPEN2K8
。在文件末尾添加
#define\u USE\u XOPEN2K8 1
。您知道,在安装编译器时,您可能做了一些配置错误。

在CentOS7和gcc 4.6中,我们必须使用-D\u XOPEN\u SOURCE=700-D\u USE\u XOPEN2K8

glibc
\u USE\u
*宏是用于实现功能选择的内部宏。支持的设置方法是定义功能测试宏,如
-D_GNU_\u SOURCE

之所以需要这些宏,是因为glibc支持许多标准和GNU扩展,而且这些功能相互冲突,主要是因为C中缺少名称空间。例如,C和POSIX允许您定义一个名为
secure\u getenv
(因为这些标准没有保留或以其他方式使用标识符),但如果使用
\u GNUS\u SOURCE
编译并包含
,这样的程序将无法工作,因为glibc提供了一个名为
secure\u getenv
的函数


是一个内部glibc头文件(头文件中的注释是这样写的)并且在glibc 2.26中不再可用。

根据您包含的链接,问题是,当您构建gcc时,它创建了system C库头文件的副本,而不是来自自定义glibc的头文件。关键是要将gcc构建指向您的glibc构建。遗憾的是,我不完全确定如何做到这一点,否则我会发布答案。查看gcc的配置选项,
--oldincludedir
--with build sysroot
可能是正确的方向,但我主要是猜测。@rra-我仍然在RHEL5上编译最新的gcc,并在以后的操作系统上运行它。这需要手动删除include fixed中的几个标题;即
features.h
pthread.h
wchar.h
sys/stat.h
,以及
bits/string2.h
。据我所知,“fixincludes”实际上已经是“breakincludes”至少十年了。