编译器忽略#define _GNU_SOURCE

时间:2015-03-19 16:15:44

标签: c windows compiler-errors mingw32

  • 我不是母语为英语的人,所以请原谅任何拼写错误或语法错误
    • 我不是编译专家,也没有任何有关构建及其错误的有用经验
    • 我是C#程序员,主要在MS Enviroment工作
    • 我只知道3 "必须知道在Linux命令中生存下来" " ./ configure,make& make install"来自我的小Linux体验

我的发展环境

  • 我使用的是Windows 7工作站 与Cygwin和MinGW(作为Linux' Replacement')进行编译。

问题

我想在Windows上编译 C源代码,这是为Linux发行版编写的主要代码。
/配置工作没有问题。
如果我使用命令 make 来编译源代码,我会遇到以下错误:

  

错误
  grib_keys.c:50:34:
  错误:' alphasort'未申报(首次使用此功能)

研究:

我的研究证明了我,这个问题已经解决了,但不幸的是,答案对我来说并不适用。

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操作系统上使用二进制文件。
  • 我也想知道,我是否将#34; #define _GNU_SOURCE" -Tag
    写入了正确的地方,或者我是否犯了错误。

下载:

阿比
 https://software.ecmwf.int/wiki/display/GRIB/Home

1 个答案:

答案 0 :(得分:3)

如果您要声明功能测试宏(例如_GNU_SOURCE),则必须确保预处理器在看到使用它们的任何代码之前看到它们。这通常意味着必须在任何系统标头之前处理它们。因此,在任何#include指令之前,最佳位置位于每个C源文件(不是标题)的顶部。

话虽如此,您需要一个适用于您实际使用的C库及其开发标题的解决方案。对于MinGW来说,它似乎是微软的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中标准化。