Linux MinGW:在编译他输出8个“多个定义”列表

问题描述:

不知不觉中!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' 

为什么?我的代码的重点是WinMain,而不是WinMainCRTStartup或mainCRTStartup。

我写link to code,因为这么大(GitHub)。

P.S .:我在Windows上用MinGW编译这段代码,并没有这个错误。 P.P.S .:为什么我不使用Windows?仅用于基础教育。

+0

你是如何创建的目标文件? –

+0

看起来像你试图在Linux上编译一个Windows可执行文件。我不相信这会起作用。 – NathanOliver

+0

@Nathan通过正确设置交叉编译选项,它可能工作正常。 –

问题是,您不会创建目标文件,而是可执行文件然后尝试链接到一起。

命令

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

确实应该

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

将创建对象文件./obj/main.o您在稍后阶段使用了实际的链接。三大区别在于你不提供多个源文件,你使用-c选项会告诉GCC前端程序只能编译成目标文件,而且你没有提供一个库(仅在链接时使用)。

这需要完成全部源文件。

然后你可以将所有的目标文件链接在一起:

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

它的工作!谢谢你! –