我正在尝试编译 gtk 堆栈(最新的 gtk2 版本,2.24),并且收到一堆似乎相关的错误。也就是说,从 string.h 和 time.h 中找不到
__locale_t
,也找不到 LC_ALL_MASK
(应该在 locale.h 中)。
我发现所有这些问题都与
__USE_XOPEN2K8
没有被#定义有关。 __USE_XOPEN2K8
的用途是什么?如何正确设置它?
例如,我是否必须为 glib、gtk 等向 ./configure 传递一个标志,或者我是否必须在构建 gcc 或 glibc̲ 时更改某些内容?我不想在不知道它的作用的情况下将
#define __USE_XOPEN2K8
撒到我的资源中。请注意,我使用的是以非标准前缀安装的 gcc-4.6.3 和 glibc-2.16.0,因为我试图让 gtk 库在仅包含旧版本的旧 CentOS (5.8) 上工作。
另请注意,在多个地方都提到了缺失的
__locale_t
,例如这个错误报告。我可以在某些文件中添加 #include <xlocale.h>
,但似乎正确的解决方案是设置 __USE_XOPEN2K8
。
编辑:我发现这个线程描述了问题。显然,主机系统的标头被“修复”到新编译器的标头中。链接的帖子建议编辑 features.h。有谁知道我之后是否需要重新编译 gcc / glibc (以及如何让它获取新的 features.h,而不是覆盖它)?
当定义
__USE_GNU
时,__USE_XOPEN2K8
也始终被定义,除非您
显式定义或取消定义这些宏,这是您绝对不能做的。
在包含之前使用 _GNU_SOURCE
、_XOPEN_SOURCE {500,600,700,...}
等宏
相反,第一个标头。这是在 glibc 标头中选择 GNU 功能集的推荐方法,并在命令行上定义它 (-D_GNU_SOURCE
)。
或者,您可以尝试通过
-std
命令行开关(gnu89
、gnu99
等)指定 gcc 的 GNU 扩展用法。
glibc
__USE_
* 宏是用于实现特征选择的内部宏。 支持的设置方法是定义功能测试宏,例如 -D_GNU_SOURCE
:
需要这些宏是因为 glibc 支持许多标准和 GNU 扩展,而这些功能相互冲突,主要是由于 C 中缺少命名空间。例如,C 和 POSIX 允许定义一个名为
secure_getenv
的全局变量
(因为这些标准未保留或以其他方式使用该标识符),但是如果使用 _GNUS_SOURCE
进行编译并包含 <stdlib.h>
,这样的程序将无法工作因为glibc提供了一个函数叫secure_getenv
。
<xlocale.h>
是内部 glibc 标头(标头文件中的注释如此说明),在 glibc 2.26 中将不再可用。
在带有 gcc 4.6 的 CentOS7 上,我们必须使用 -D_XOPEN_SOURCE=700 -D__USE_XOPEN2K8
据我所知,当我们使用编译器时,它的行为取决于一些ENV宏,这些宏保存在
feature.h
中。所以你可以通过修改它来配置你的编译器。
首先,您需要使用 g++ -E youfile > log
来查看编译器使用哪个 feature.h
文件,然后使用 g++ -E -dM /path/to/feature.h>log
来查找 __USE_XOPEN2K8
(如果找不到)。在文件末尾添加 #define __USE_XOPEN2K8 1
。你知道你可能在安装编译器时做了一些配置错误。
引用 Rical Jasan 的话:
XOPEN2K 通常是一个无用的名称。实际上在标题中 指 POSIX.1-2001; X/Open 版本是 __USE_XOPEN2KXSI。 同样地 __USE_XOPEN2K8 表示 POSIX.1-2008,X/Open 版本是 __USE_XOPEN2K8XSI。 所以无论你在哪里说 XOPEN2K 因为标头使用 __USE_XOPEN2K,在手册中改为 POSIX.1-2001;同样地 XOPEN2K8 的 POSIX.1-2008。
原始邮件列表可以在这里找到。
所以要真正回答你的问题:
__USE_XOPEN2K8 的用途是什么
它是一个标志,指定源是否与 POSIX.1-2008 和 X/Open 7 规范兼容。 X/Open 7 构建在 POSIX.1-2008 之上,因此用最简单的术语来说“至少满足 POSIX.1-2008”。
如何正确设置?
已定义/未定义正确的值类型(布尔值)。正如其他人所说,您不应该手动设置它。相反,当设置
features.h
或 POSIX >= 2008
时,它会从 XOPEN_SOURCE >= 700
标头启用。如果不是,那么这是一个实现错误(如果它实际上用于启用这些规范定义的功能),但如果您的目标是 UNIX,请尝试同时设置 _XOPEN_SOURCE=700
;如果您的目标是 POSIX,请尝试设置 _POSIX_C_SOURCE=200809L
。
为了编译 gcc 和 glibc,您可能应该启用
_GNU_SOURCE
(不是 100% 确定需要它,很可能是)。当使用 GNU 编译器编译您自己的源代码时,如果您希望代码也使用 LLVM 编译器进行编译,您(可以但是)可能不应该使用 _GNU_SOURCE
。