2017-06-27 18 views
-1

Неllоеvеrybоdу!Linux MinGW:8 "複数の定義の出力リストをコンパイルするとき

私は、Linux上でのMinGWを使用してプログラムをコンパイルしよう:

i686-w64-mingw32-g++ -static -mwindows ./obj/CFLF.o ./obj/resources.o -o ./bin/CFLF.exe 

と、この出力をキャッチ:

./mingw-w64-crt/crt/crtexe.c:171: multiple definition of `WinMainCRTStartup' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/../../../../i686-w64- 
mingw32/lib/../lib/crt2.o:./mingw-w64-crt/crt/crtexe.c:171: first 
defined here 
./obj/CFLF.o: In function `mainCRTStartup': 
./mingw-w64-crt/crt/crtexe.c:199: multiple definition of `mainCRTStartup' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/../../../../i686-w64- 
mingw32/lib/../lib/crt2.o:./mingw-w64-crt/crt/crtexe.c:199: first 
defined here 
./obj/CFLF.o:cygming-crtbegin.c:(.text+0x500): multiple definition of `__gcc_register_frame' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/crtbegin.o:cygming-crtbegin.c: 
(.text+0x0): first defined here 
./obj/CFLF.o:cygming-crtbegin.c:(.text+0x560): multiple definition of __gcc_deregister_frame' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/crtbegin.o:cygming-crtbegin.c: 
(.text+0x60): first defined here 
./obj/CFLF.o:crtexe.c:(.CRT+0x10): multiple definition of `mingw_pcinit' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/../../../../i686-w64- 
mingw32/lib/../lib/crt2.o:./mingw-w64-crt/crt/crtexe.c:118: first 
defined here 
./obj/CFLF.o:crtexe.c:(.data+0x0): multiple definition of `__mingw_winmain_nShowCmd' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/../../../../i686-w64- 
mingw32/lib/../lib/crt2.o:./mingw-w64-crt/crt/crtexe.c:118: first 
defined here 
./obj/CFLF.o:crtexe.c:(.CRT+0x4): multiple definition of `mingw_pcppinit' 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/../../../../i686-w64- 
mingw32/lib/../lib/crt2.o:./mingw-w64-crt/crt/crtexe.c:118: first 
defined here 
/usr/lib/gcc/i686-w64-mingw32/6.2-win32/crtbegin.o:cygming-crtbegin.c: 
(.text+0x22): undefined reference to `_Jv_RegisterClasses' 

なぜ?私のコードのポイントは、WinMainCRTStartupまたはmainCRTStartupではなく、WinMainです。

私はlink to codeと書くことができます(GitHub)。

P .: WindowsでMinGWを使用してこのコードをコンパイルしても、このエラーは発生していません。 P.P.S:なぜWindowsを使用しないのですか?基本教育のためだけに。

+0

どのようにオブジェクトファイルを作成したのですか? –

+0

LinuxでWindows実行ファイルをコンパイルしようとしているようです。それがうまくいくとは思わない。 – NathanOliver

+0

@Nathanクロスコンパイルオプションが正しく設定されていれば、うまくいく可能性があります。 –

答えて

1

問題は、オブジェクトファイルを作成せずに、実行可能ファイルをリンクすることです。

コマンド

i686-w64-mingw32-g++ ./src/main.cpp ./src/downloader.cpp -o ./obj/CFLF.o -lwinhttp 

は本当にあなたの実際のリンクのための後の段階での使用でオブジェクトファイル./obj/main.oを作成します

i686-w64-mingw32-g++ ./src/main.cpp -c -o ./obj/main.o 

でなければなりません。 3つの大きな違いは、複数のソースファイルを用意していないということです。-cオプションは、GCCフロントエンドプログラムにオブジェクトファイルにのみコンパイルするよう指示し、ライブラリを提供しません(リンク時にのみ使用されます)。

すべてソースファイルに対してこれを行う必要があります。

その後、あなたはすべてのオブジェクトファイルを一緒にリンクすることができます。

i686-w64-mingw32-g++ ./obj/main.o ./obj/downloader.o ./obj/resources.o -o ./bin/CFLF.exe -lwinhttp 
+0

それは働いた!ありがとうございました! –

関連する問題