2016-05-26 20 views
1

Ich habe ein C-Programm; Es kompiliert und verbindet sich mit gcc -std=gnu11 iter.c -o iter, weil ich einige GNU string.h Erweiterungen wie strndup, strnlen und strsep verwende.Kompilieren von Gnu11 für Windows mit MinGW unter Linux

Ich möchte dieses Programm für Windows mit dem Paket i686-w64-mingw32-gcc auf Ubuntu Linux kompilieren.

$ 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 

Ich habe alle erforderlichen MinGW Laufzeit und Bibliotheken installiert, aber MinGW scheint die -std=gnu11 Richtlinie zu ignorieren. Es ignoriert die Option nicht vollständig, weil -std=asdf "unerkannt" ist, aber es ablehnt, GNU C zu kompilieren.

Gibt es eine Möglichkeit, dass ich ein Programm, das GNU-Erweiterungen verwendet, für Windows kompilieren kann?

+1

Wenn Sie ein Programm kompilieren, das auf der C-Laufzeitbibliothek von Microsoft beruht, wie dies bei MinGWin-Programmen der Fall ist, sind Sie auf die Funktionen dieser Bibliothek beschränkt. Sie sollten dankbar sein, dass der Compiler Ihnen davon erzählt, anstatt ein Programm zu erstellen, das zum Absturz gebracht werden soll. –

+0

@JohnBollinger ist nicht MinGW "Minimalist GNU für Windows"? In der Tat, es ist ** GCC ** und GNU's LibC mit GCC verbunden, so würde man erwarten, dass die Header GNU sind. – cat

+1

MinGW bietet viele GNU * -Programme *, einschließlich GCC, die nativ unter Windows laufen. Es stellt die GNU C-Bibliothek * nicht * zur Verfügung und stützt sich stattdessen auf Microsoft. Es stützt sich auch auf andere Windows-Systembibliotheken. Dies ist eindeutig [dokumentiert] (http://www.mingw.org/), und es macht Sinn. –

Antwort

3

Wie in den Kommentaren diskutiert, obwohl MinGW bietet viele GNU-Programme, einschließlich GCC, bietet es nicht die GNU C-Bibliothek. C-Programme, die von GCC für die MinGW-Umgebung erstellt werden, basieren auf der C-Laufzeitbibliothek von Microsoft. Sie können GNU Sprache Erweiterungen verwenden, aber nicht im Allgemeinen GNU Bibliothek Erweiterungen, die nicht auch von Microsoft implementiert sind. Auf der anderen Seite, sie können auf Microsoft-Bibliothekserweiterungen, die nicht von GNU implementiert sind, obwohl sie möglicherweise ihre eigenen Header bereitstellen müssen.

Wenn Ihr Programm auf Funktionen angewiesen ist, die in der Zielumgebung (z. B. Windows/MinGW) verfügbar sind oder nicht, verwenden Sie normalerweise bedingte Kompilierungsdirektiven und möglicherweise Makros, um diese Funktionen in Builds für Ziele zu ersetzen die bieten sie nicht an. Abhängig von der jeweiligen Funktion kann dies bedeuten, dass Sie Ihre eigene Implementierung bedingt bereitstellen.

Wie Sie bedingte Kompilierung in Ihr Build-System integrieren, ist eine viel umfassendere Frage. Wenn Sie die Autotools verwenden, gehören Einrichtungen für diese Art von Dingen zu seinen Kernfunktionen. Sie können mit CMake und wahrscheinlich mit den meisten anderen gängigen Systemen ähnlich verfahren. Wenn Sie ein handgerolltes Build-System verwenden, haben Sie natürlich sowohl die Freiheit als auch die Verpflichtung, Ihre eigene Vorgehensweise zu entwickeln.

Verwandte Themen