2016-05-26 104 views
1

我有一个C程序;它编译并链接到gcc -std=gnu11 iter.c -o iter,因为我正在使用一些GNU string.h扩展名,如strndup,strnlenstrsep在Linux上用MinGW编译Gnu11 for Windows

我想在Ubuntu Linux上使用软件包i686-w64-mingw32-gcc来编译该程序。

$ i686-w64-mingw32-gcc -std=gnu11 iter.c -o iter32.exe 
In file included from iter.c:1:0: 
iter.h: In function ‘str_chomp’: 
iter.h:166:15: warning: implicit declaration of function ‘strndup’ [-Wimplicit-function-declaration] 
    char* new = strndup(str, MAX_STR_LEN); 
      ^
iter.h:166:15: warning: incompatible implicit declaration of built-in function ‘strndup’ 
iter.h: In function ‘str_split’: 
iter.h:189:19: warning: incompatible implicit declaration of built-in function ‘strndup’ 
     *str_copy = strndup(str, MAX_STR_LEN); 
       ^
iter.h:211:26: warning: implicit declaration of function ‘strsep’ [-Wimplicit-function-declaration] 
    for (i = 0; (token = strsep(&str_copy, delim_str)) != NULL; i++) { 
         ^
iter.h:211:24: warning: assignment makes pointer from integer without a cast [-Wint-conversion] 
    for (i = 0; (token = strsep(&str_copy, delim_str)) != NULL; i++) { 
         ^
/tmp/ccPH0nG5.o:iter.c:(.text+0x216): undefined reference to `strndup' 
/tmp/ccPH0nG5.o:iter.c:(.text+0x2bf): undefined reference to `strndup' 
/tmp/ccPH0nG5.o:iter.c:(.text+0x3a7): undefined reference to `strsep' 
collect2: error: ld returned 1 exit status 

我已经安装了所有必需的MinGW运行时和库,但MinGW的似乎忽视了-std=gnu11指令。它并不完全忽略该选项,因为-std=asdf是“无法识别的”,但它拒绝交叉编译GNU C.

有没有一种方法可以使用GNU扩展程序为Windows交叉编译?

+1

如果您正在编译一个依赖Microsoft C运行时库的程序,就像MinGWin程序一样,那么您仅限于该库提供的函数。你应该感谢编译器告诉你这个,而不是在运行时创建一个注定要崩溃的程序。 –

+0

@JohnBollinger不是MinGW“Windows简约GNU”吗?事实上,它是** GCC **,并且GNU的LibC与GCC链接,所以人们会认为这些标头是GNU。 – cat

+1

MinGW提供了许多GNU *程序*,包括GCC,在Windows上本地运行。它不*提供GNU C库,而是依靠微软的。它也依赖于其他一些Windows系统库。这显然是[记录](http://www.mingw.org/),它是有道理的。 –

回答

3

正如评论中所述,虽然MinGW提供了许多GNU程序,包括GCC,但它不提供GNU C库。由GCC为MinGW环境构建的C程序依赖于Microsoft的C运行时库。他们可以使用GNU 语言扩展名,但不一定是GNU 扩展名,这些扩展名也不是由Microsoft实施的。另一方面,它们可以依赖于未由GNU实现的Microsoft库扩展,尽管它们可能需要提供它们自己的头文件。

如果您的程序依赖于目标环境中可能或不可用的函数(例如Windows/MinGW),那么通常的做法是使用条件编译指令,也许可以使用宏替代这些函数的构建目标不提供它们。根据特定的功能,这可能意味着您有条件地提供自己的实施。

如何将条件编译集成到构建系统中是一个更为广泛的问题。如果你使用的是Autotools,那么这种设备就是其核心功能之一。你可以用CMake来做类似的事情,也可能和其他大多数流行的系统一样。如果您使用的是手动构建系统,那么当然您有自由和义务来提出自己的方法。