6

我正在尝试编译 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 时已经更改某些内容?我宁愿不只是#define __USE_XOPEN2K8在不知道它的作用的情况下散布到我的消息来源。注意我使用的是安装在非标准前缀中的 gcc-4.6.3 和 glibc-2.16.0,因为我试图让 gtk 库在只包含旧版本的旧 CentOS (5.8) 上工作。

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


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

4

4 回答 4

6

When __USE_GNUis defined,__USE_XOPEN2K8也总是被定义,除非你明确定义或取消定义这些宏,你不能这样做。在包含第一个标题之前使用_GNU_SOURCE, etc. 宏。_XOPEN_SOURCE {500,600,700,...}这是在 glibc 头文件中选择 GNU 功能集的推荐方法,同时在命令行 ( -D_GNU_SOURCE) 上定义它。

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

于 2013-09-24T15:29:57.257 回答
3

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

于 2016-06-20T14:39:42.937 回答
2

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

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

<xlocale.h>是一个内部 glibc 头文件(头文件中的注释是这样说的)并且在 glibc 2.26 中将不再可用。

于 2017-07-24T08:01:20.910 回答
0

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

于 2016-02-27T07:44:13.623 回答