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

jdm*_*jdm 4 gcc glibc

我正在尝试编译gtk堆栈(最后一个gtk2版本,2.24),我得到了一堆似乎相关的错误.也就是说,__locale_t无法从string.h和time.h 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)上运行.

还要注意__locale_t在几个地方提到缺失,例如这个bug报告.我可以添加#include <xlocale.h>一些文件,但似乎正确的解决方案__USE_XOPEN2K8是设置.


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

Mic*_*kis 6

何时__USE_GNU定义,__USE_XOPEN2K8总是定义,除非您明确定义或取消定义这些宏,否则您不能这样做.使用_GNU_SOURCE,_XOPEN_SOURCE {500,600,700,...}等宏包括第一头而不是之前.这是在glibc头中选择GNU功能集的推荐方法,同时在命令行(-D_GNU_SOURCE)上定义它.

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