2016-05-26 103 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來做類似的事情,也可能和其他大多數流行的系統一樣。如果您使用的是手動構建系統,那麼當然您有自由和義務來提出自己的方法。