2017-06-27 1 views
-1

Неllе еверно!Linux MinGW: lors de la compilation de la liste de sortie de 8 "définitions nulles"

Je tente de compiler le programme avec MinGW sous Linux:

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

et attraper cette sortie:

./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' 

Pourquoi? Le point de mon code est WinMain, pas WinMainCRTStartup ou mainCRTStartup. J'écris link to code, parce qu'il est si grand (GitHub).

P.S .: Je compile ce code avec MinGW sous Windows et n'a pas cette erreur. P.P.S .: Pourquoi je n'utilise pas Windows? Juste pour l'éducation de base.

+0

Comment avez-vous créé les fichiers d'objet? –

+0

On dirait que vous essayez de compiler un exécutable Windows sous Linux. Je ne crois pas que cela fonctionnera. – NathanOliver

+0

@Nathan Avec les options de compilation croisée correctement définies, cela peut fonctionner correctement. –

Répondre

1

Le problème est que vous ne créez pas de fichiers objets, mais fichiers exécutables que vous essayez ensuite de lier ensemble.

La commande

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

devrait vraiment être

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

Cela va créer le fichier objet vous ./obj/main.o que dans une utilisation plus tard pour la liaison réelle. Les trois grandes différences sont que vous ne fournissez pas plusieurs fichiers source, vous utilisez l'option -c qui indique au programme d'interface GCC de compiler uniquement dans des fichiers objet, et vous ne fournissez pas de bibliothèque (utilisée uniquement lors de la liaison).

Ceci doit être fait pour tous les fichiers source.

Ensuite, vous pouvez relier tous les fichiers objets ensemble:

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

Ça a marché! Merci beaucoup! –