我有一个C程序;它编译并与gcc -std=gnu11 iter.c -o iter
链接,因为我正在使用一些GNU string.h
扩展程序,如strndup
,strnlen
和strsep
。
我想在Ubuntu Linux上使用包i686-w64-mingw32-gcc
为Windows编译此程序。
$ 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编译程序?
答案 0 :(得分:3)
正如评论中所讨论的,尽管MinGW提供了许多GNU程序,包括GCC,但它并没有提供GNU C库。 GCC为MinGW环境构建的C程序依赖于Microsoft的C运行时库。他们可以使用GNU 语言扩展,但通常不使用也不是由Microsoft实现的GNU 库扩展。另一方面,他们可以依赖于GNU未实现的Microsoft库扩展,尽管他们可能需要提供自己的头文件。
如果你的程序依赖于目标环境中可能有或没有的函数(例如Windows / MinGW),那么通常的方法是使用条件编译指令和宏来代替那些用于构建目标的函数的替代方法。不提供它们。根据具体的功能,这可能意味着您有条件地提供自己的实现。
如何将条件编译集成到构建系统中是一个更广泛的问题。如果您使用的是Autotools,那么这类设备就属于其核心功能。您可以使用CMake,也可以与大多数其他流行系统类似。如果您使用的是手动构建系统,那么您当然有自由和义务来提出自己的方法。