__USE_XOPEN2K8的目的以及如何设置它?

时间:2012-12-14 13:07:20

标签: gcc glibc

我正在尝试编译gtk堆栈(最后一个gtk2版本,2.24),我收到了一堆似乎相关的错误。也就是说,无法在string.h和time.h中找到__locale_t,也找不到LC_ALL_MASK(应该在locale.h中)。

我发现所有这些问题都与__USE_XOPEN2K8没有#defined有关。什么是__USE_XOPEN2K8,以及如何设置属性?

例如,我是否必须将标志传递给./configure以用于glib,gtk,...或者在构建gcc或glib c 时是否必须更改某些内容?我宁愿不只是将#define __USE_XOPEN2K8洒到我的来源而不知道它的作用。注意我正在使用安装在非标准前缀中的gcc-4.6.3和glibc-2.16.0,因为我正在尝试让gtk库在仅包含旧版本的旧版CentOS(5.8)上运行。 / p>

另请注意,在某些地方提到了遗漏的__locale_t,例如this bugreport。我可以在一些文件中添加#include <xlocale.h>,但似乎正确的解决方案是设置__USE_XOPEN2K8


编辑:我发现this thread描述了这个问题。显然,主机系统的头文件被“fixincluded”放入新编译器的头文件中。链接的帖子建议编辑features.h。有谁知道我之后是否必须重新编译gcc / glibc(以及如何让它获取新的features.h,而不是覆盖它)?

4 个答案:

答案 0 :(得分:6)

定义__USE_GNU时,除了您之外,始终定义__USE_XOPEN2K8 明确定义或取消定义这些宏,你不能这样做。 在包含之前使用_GNU_SOURCE_XOPEN_SOURCE {500,600,700,...}等宏 而是第一个标题。这是在glibc头文件中选择GNU功能集的推荐方法,同时在命令行(-D_GNU_SOURCE)上定义它。

或者,您可以尝试通过-std命令行开关(gnu89gnu99等来指定gcc的GNU扩展用法。

答案 1 :(得分:3)

在使用gcc 4.6的CentOS7上我们必须使用-D_XOPEN_SOURCE = 700 -D__USE_XOPEN2K8

答案 2 :(得分:2)

glibc __USE_ *宏是用于实现特征选择的内部宏。支持的设置方法是定义功能测试宏,例如-D_GNU_SOURCE

这些宏是必需的,因为glibc支持许多标准和GNU扩展,并且这些功能彼此冲突,主要是由于C中缺少命名空间。例如,C和POSIX允许您定义一个名为的全局变量secure_getenv(因为这些标准没有保留或以其他方式使用标识符),但如果使用_GNUS_SOURCE进行编译并包含<stdlib.h>,则此类程序将无法工作,因为glibc提供了一个名为{的函数{1}}。

secure_getenv是一个内部glibc标头(头文件中的注释表示如此),并且在glibc 2.26中将不再可用。

答案 3 :(得分:0)

据我所知,当我们使用编译器时,它的行为取决于一些保存在feature.h中的ENV宏。因此,您可以通过modifyinfg配置您的编译器。 Fisrt,您需要使用g++ -E youfile > log,查看您的编译器使用哪个feature.h文件,然后使用g++ -E -dM /path/to/feature.h>log查找__USE_XOPEN2K8,如果找不到它。在文件末尾添加#define __USE_XOPEN2K8 1。您可能知道在安装编译器时可能有一些配置错误。