编译器忽略 #define _GNU_SOURCE。

4
  • 由于我不是英语的母语者,请见谅我的拼写或语法错误。
    • 我不是编译专家,也没有任何有用的构建和其错误方面的经验。
    • 我是C#程序员,主要在MS环境中工作。
    • 我仅知道3个“必须了解的Linux命令”,即“./configure、make & make install”,这来自于我少量的Linux经验。

我的开发环境

  • 我正在使用Windows 7工作站
    并使用Cygwin和MinGW(作为Linux“替代品”)进行编译。

问题

我想在Windows上编译原本为Linux发行版编写的C源代码
/Configure可以正常工作。
如果我使用make命令编译源代码,则会遇到以下错误:

错误
grib_keys.c:50:34:
error: ‘alphasort’ undeclared (first use in this function)

研究:

我的研究证明,这个问题已经被解决了,但不幸的是,答案对我不起作用。

Implicit declaration of scandir; alphasort is undeclared
http://ubuntuforums.org/archive/index.php/t-1653576.html

解决方案说,我只需包含以下内容:#define _GNU_SOURCE
我尝试过了,但正如我已经说明的那样,它不起作用。

我在以下文件中包含了它:

- grib_keys.c
- config.h

我尝试同时编译它们和分别编译它们,以涉及并发和非并发包含。

最终,文件的重要部分看起来像这样:

config.h
********
/* Add #define _GNU_SOURCE to solve  "'alphasort' undeclared" error  */
#define _GNU_SOURCE

grib_keys.c
***********
#define _GNU_SOURCE
count = scandir(dir, &files, 0, alphasort);

我想要实现的目标和了解的内容:

  • 我想编译下面所述API的全部源代码,以在Windows操作系统上使用二进制文件。
  • 同时,我想知道我是否将“#define _GNU_SOURCE”标签写在了正确的位置,或者我是否犯了错误。

下载:

API
https://software.ecmwf.int/wiki/display/GRIB/Home


3
尝试在编译命令行中加入 "-D_GNU_SOURCE"(或者可能是在"CFLAGS"中添加),这可以提高编译器的兼容性。 - Kerrek SB
也许MinGW并没有实现那个函数? - cremno
2
"使用Cygwin和MinGW" - 这很可能是问题所在。这两个是不同的产品,不需要同时使用。根据您的帖子,我想您想使用Cygwin而不是MinGW(更多信息请参见此处)。 - fstanis
1
@JohnBollinger:MinGW 不使用 glibc,而 Cygwin 使用 newlib(显然实现了它)。 - cremno
@JohnBollinger:对于Cygwin,您的答案可能是正确的。您能恢复它吗?而MinGW(-w64)确实没有实现它。 - cremno
显示剩余4条评论
1个回答

4
如果您要声明功能测试宏,例如_GNU_SOURCE,则必须确保预处理器在看到任何使用它们的代码之前就已经看到了它们。这通常意味着它们必须在任何系统头文件之前处理。因此,最佳放置位置是在每个C源文件(而不是头文件)的顶部,在任何#include指令之前。
话虽如此,您需要一个适用于您实际使用的C库及其开发头文件的解决方案。对于MinGW,似乎是Microsoft的C库,该库似乎没有记录alphasort()函数。
即使您正在使用glibc(例如Cygwin的版本),我的glibc文档中也声称alphasort()所需的功能测试宏是_BSD_SOURCE_SVID_SOURCE,而不是_GNU_SOURCE。自glibc 2.10以来,最好使用_POSIX_C_SOURCE >= 200809L_XOPEN_SOURCE >= 700,因为这些反映了该函数在POSIX.1-2008中被标准化的事实。

_GNU_SOURCE 请求所有内容,包括您的 glibc(或 newlib)发布时的最新 _XOPEN_SOURCE,因此在 cygwin 中获取 alphasort 的声明应该足够了。然而,在 mingw 上是无用的,这是主要问题。 - user2404501
实际上看起来MinGW在使用_GNU_SOURCE时工作正常,但mingw64却不行... - Simon Sobisch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接