__USE_XOPEN2K8的用途以及如何设置?

问题描述 投票:0回答:5

我正在尝试编译 gtk 堆栈(最新的 gtk2 版本,2.24),并且收到一堆似乎相关的错误。也就是说,从 string.h 和 time.h 中找不到

__locale_t
,也找不到
LC_ALL_MASK
(应该在 locale.h 中)。

我发现所有这些问题都与

__USE_XOPEN2K8
没有被#定义有关。
__USE_XOPEN2K8
的用途是什么?如何正确设置它?

例如,我是否必须为 glib、gtk 等向 ./configure 传递一个标志,或者我是否必须在构建 gcc 或 glib 时更改某些内容?我不想在不知道它的作用的情况下将

#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,而不是覆盖它)?

gcc glibc
5个回答
6
投票

当定义

__USE_GNU
时,
__USE_XOPEN2K8
也始终被定义,除非您 显式定义或取消定义这些宏,这是您绝对不能做的。 在包含之前使用
_GNU_SOURCE
_XOPEN_SOURCE {500,600,700,...}
等宏 相反,第一个标头。这是在 glibc 标头中选择 GNU 功能集的推荐方法,并在命令行上定义它 (
-D_GNU_SOURCE
)。

或者,您可以尝试通过

-std
命令行开关(
gnu89
gnu99
等)指定 gcc 的 GNU 扩展用法。


4
投票

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 中将不再可用。


3
投票

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


0
投票

据我所知,当我们使用编译器时,它的行为取决于一些ENV宏,这些宏保存在

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


0
投票

引用 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-2008X/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

© www.soinside.com 2019 - 2024. All rights reserved.