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?仅用于基础教育。
答
问题是,您不会创建目标文件,而是可执行文件然后尝试链接到一起。
命令
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
它的工作!谢谢你! –
你是如何创建的目标文件? –
看起来像你试图在Linux上编译一个Windows可执行文件。我不相信这会起作用。 – NathanOliver
@Nathan通过正确设置交叉编译选项,它可能工作正常。 –