2016-05-26 2 views
1

私はCプログラムを持っています。 、strnlenstrsepのようなGNU string.hという拡張子を使用しているため、コンパイルしてgcc -std=gnu11 iter.c -o iterとリンクしています。LinuxでMinGWを使ってGnu11をコンパイルする

私は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でクロスコンパイルできる方法はありますか?

+1

MinGWinプログラムのように、MicrosoftのCランタイムライブラリに依存するプログラムをコンパイルする場合は、そのライブラリが提供する機能に限定されます。実行時にクラッシュする予定のプログラムをビルドするのではなく、コンパイラがこれについてあなたに伝えることに感謝しています。 –

+0

@JohnBollinger MinGWの「Minimalist GNU for Windows」はありませんか?確かに、それは** GCC **であり、GNUのLibCはGCCとリンクしているので、ヘッダーはGNUであると予想されます。 – cat

+1

MinGWは、Windows上でネイティブに動作するGCCを含む多くのGNU *プログラム*を提供しています。代わりにMicrosoftのものに頼ってGNU Cライブラリを提供していません。他のWindowsシステムライブラリにも依存しています。これは明らかに[文書化されている](http://www.mingw.org/)であり、意味があります。 –

答えて

3

コメントで説明したように、MinGWはGCCを含む多くのGNUプログラムを提供していますが、GNU Cライブラリを提供していません。 MinGW環境用にGCCによって構築されたCプログラムは、MicrosoftのCランタイムライブラリに依存しています。彼らはGNU の言語の拡張子を使用することができますが、GNU ライブラリの拡張子は、Microsoftによって実装されていません。一方、彼らは独自のヘッダを提供する必要があるかもしれませんが、がGNUによって実装されていないMicrosoftライブラリ拡張に依存しています。

プログラムがターゲット環境(Windows/MinGWなど)で利用可能な機能や利用できない機能に依存する場合、通常は条件付きコンパイル指令やマクロを使用して、ターゲットのビルドそれらを提供していない。特定の関数に応じて、条件付きで独自の実装を提供する可能性があります。

条件付きコンパイルをビルドシステムに統合する方法は、はるかに広い質問です。 Autotoolsを使用している場合、この種の機能のための機能はその中核機能の1つです。あなたはCMakeと、おそらく他の多くの一般的なシステムと同様のことができます。手作りのビルドシステムを使用している場合は、もちろん、あなた自身のアプローチを思いつく自由と義務があります。

関連する問題