Lier une .dll / .lib avec MinGW sous Win7(VS2010)
sylv_brl
Messages postés
22
Statut
Membre
-
sylv_brl Messages postés 22 Statut Membre -
sylv_brl Messages postés 22 Statut Membre -
Bonjour à tous,
Donc premièrement voilà la traduction du titre/problème :
J'essaie actuellement de compiler le projet global realxtend comprenant un .bat gérant la compilation de toutes les dépendances, or j'aurais besoin d'y implémenter rabbitmq-c suivis de amqpcpp (toutes les sources sont sur GitHub). J'essaye donc de compiler ces deux projets successivement, 'rabbitmq-c' par ' cmake .. & cmake --build .' puis 'amqpcpp' via 'make' de MinGW, sous la console VisualStudio Ultimate 2010 (avec x64 tools), avec un MakeFile pour gérer les dépendances de 'amqpcpp'. Mais je rencontre le problème suivant à l'étape de compilation de 'amqpcpp' (qui dépend de la librairie 'rabbitmq.1' compilée juste avant) :
J'ai donc essayé plutôt de suivre le Readme pour compiler 'amqpcpp' isolé du projet mais 'cmake' aboutit à :
J'observe donc que la .lib n'importe pas correctement/de la même manière la fonction amqp_empty_table, ce que je penses être la cause de mon problème de linking lors de la compilation de 'amqpcpp'
J'ai trouvé une possible explication :
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa271769(v=vs.60)?redirectedfrom=MSDN
et des problèmes similaires :
https://stackoverflow.com/questions/3704374/linking-error-lnk2019-in-msvc-unresolved-symbols-with-imp-prefix-but-shoul
http://mingw-users.1079350.n2.nabble.com/imp-prefixes-when-linking-td7386007.html
https://stackoverflow.com/questions/5159353/how-can-i-get-rid-of-the-imp-prefix-in-the-linker-in-vc
Finalement, j'ai du mal à en dégager une solution pour compiler en bonne et dûe forme 'amqpcpp' précédé et dépendant des librairie/headers de 'rabbitmq-c' qui est à mon avis le coeur du problème ici.
Deuxièmement (enfin), je viens d'un cursus généraliste et pas informatique, donc j'ai beaucoup de mal à comprendre tout ce qu'implique l'environnement de développement, donc désolé si ça vous parait confus/incomplet, j'essaie de détailler au maximum ce que je penses comprendre et pas mal de choses me paraissent déjà assez claires maintenant.
____________________________________________
PS1 : MakeFile édité pour 'amqpcpp'
PS2 : amqp.h contenant des consignes '_declspec(import)' :
https://github.com/alanxz/rabbitmq-c/blob/master/librabbitmq/amqp.h
que j'essaie actuellement de configurer (bidouiller serait plus juste) pour régler le problème d'importation/link de la fonction.
PS3 : J'essaie bien sûr d'avoir des réponses directement des devs de ces différents projets mais si quelqu'un peut résoudre, corriger ou expliquer rien qu'un bout de ce sujet il serait le bienvenu.
Donc premièrement voilà la traduction du titre/problème :
J'essaie actuellement de compiler le projet global realxtend comprenant un .bat gérant la compilation de toutes les dépendances, or j'aurais besoin d'y implémenter rabbitmq-c suivis de amqpcpp (toutes les sources sont sur GitHub). J'essaye donc de compiler ces deux projets successivement, 'rabbitmq-c' par ' cmake .. & cmake --build .' puis 'amqpcpp' via 'make' de MinGW, sous la console VisualStudio Ultimate 2010 (avec x64 tools), avec un MakeFile pour gérer les dépendances de 'amqpcpp'. Mais je rencontre le problème suivant à l'étape de compilation de 'amqpcpp' (qui dépend de la librairie 'rabbitmq.1' compilée juste avant) :
C:\Users\Sylvain\naali-3dlive\deps-vs2010-x64\amqp\amqpcpp>make -j4
g++ -Wall -IC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/librabbitmq/ -IC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/a
mqpcpp/include -LC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/build/librabbitmq/Debug/ -c -o src/AMQP.o src/AMQP.cpp
...
g++ -Wall -IC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/librabbitmq/ -IC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/am
qpcpp/include -LC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/build/librabbitmq/Debug/ -o example_get examples/example_get.cpp
libamqpcpp.a -lrabbitmq
c:/mingcwc/::b//inmmi/inngg.ww.//bb/iinnli//b../..gcc///lliibbmin//gw3gg2cccc///4m.im6ni.gn2wg3w23/2/./4..46..6/2.2.//..../././.../...//.../..m/i/ng.w.32..///bm
imininnggw/w3322ld/./exbebiinn:// lldcd.a.enexnxeoet:: fciacnnadnnonto t - fiflnirdnadb b i-tm-qlral
baibtbmiqtmq
c
ollcecocoltll2le:ec ctt2l:2d : al ldrd ea t aor uerrtenotéuo ru1nr énc éo1 d 1ec ocddo'edé etd 'adté'é ttadat' ted x'dé'ecxeuéxtcéicuoutnti
oonn
make: *** [example_publish] Erreur 1
make: *** Attente des tâches non terminées....
make: *** [example_consume] Erreur 1
make: *** [example_get] Erreur 1
J'ai donc essayé plutôt de suivre le Readme pour compiler 'amqpcpp' isolé du projet mais 'cmake' aboutit à :
J'ai donc réussis à inspecter rabbitmq.1.lib via cmd 'dumpbin /all PATH' me donnant en partie ce qui suit :
'libamqpcpp.a(AMQPQueue.o):AMQPQueue.cpp:(.text+0x1889): undefined reference to '_imp__amqp_empty_table'
collect2: ld return 1 code execute state
make: *** [example_publish] Erreur 1
...
XXXX __imp_FUNCTION
XXXX _FUNCTION
...
431A __imp__amqp_tx_commit
431A _amqp_tx_commit
438A __imp__amqp_tx_rollback
438A _amqp_tx_rollback
2B08 __imp__amqp_confirm_select
2B08 _amqp_confirm_select
3090 __imp__amqp_empty_bytes
3102 __imp__amqp_empty_table
301E __imp__amqp_empty_array
32D2 __imp__amqp_error_string
32D2 _amqp_error_string
268E __imp__amqp_basic_publish
268E _amqp_basic_publish
...
J'observe donc que la .lib n'importe pas correctement/de la même manière la fonction amqp_empty_table, ce que je penses être la cause de mon problème de linking lors de la compilation de 'amqpcpp'
J'ai trouvé une possible explication :
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa271769(v=vs.60)?redirectedfrom=MSDN
et des problèmes similaires :
https://stackoverflow.com/questions/3704374/linking-error-lnk2019-in-msvc-unresolved-symbols-with-imp-prefix-but-shoul
http://mingw-users.1079350.n2.nabble.com/imp-prefixes-when-linking-td7386007.html
https://stackoverflow.com/questions/5159353/how-can-i-get-rid-of-the-imp-prefix-in-the-linker-in-vc
Finalement, j'ai du mal à en dégager une solution pour compiler en bonne et dûe forme 'amqpcpp' précédé et dépendant des librairie/headers de 'rabbitmq-c' qui est à mon avis le coeur du problème ici.
Deuxièmement (enfin), je viens d'un cursus généraliste et pas informatique, donc j'ai beaucoup de mal à comprendre tout ce qu'implique l'environnement de développement, donc désolé si ça vous parait confus/incomplet, j'essaie de détailler au maximum ce que je penses comprendre et pas mal de choses me paraissent déjà assez claires maintenant.
____________________________________________
PS1 : MakeFile édité pour 'amqpcpp'
CXX = g++
CFLAGS = -Wall
CPPFLAGS = $(CFLAGS) -Ic:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/librabbitmq/ -Ic:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/amqpcpp/include -Lc:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/build/librabbitmq/Debug/
LIBRARIES= rabbitmq.1
LIBS = $(addprefix -l,$(LIBRARIES))
LIBNAME = amqpcpp
LIBFILE = lib$(LIBNAME).a
SOURCES = src/AMQP.cpp src/AMQPBase.cpp src/AMQPException.cpp src/AMQPMessage.cpp src/AMQPExchange.cpp src/AMQPQueue.cpp
EXFILES = example_publish.cpp example_consume.cpp example_get.cpp
EXAMPLES = $(EXFILES:.cpp=)
OBJECTS = $(SOURCES:.cpp=.o)
all: lib $(EXAMPLES)
lib: $(LIBFILE)
$(LIBFILE): $(OBJECTS)
$(AR) rcs $@ $(OBJECTS)
$(EXAMPLES): $(addprefix examples/,$(EXFILES)) $(LIBFILE)
$(CXX) $(CPPFLAGS) -o $@ examples/$@.cpp $(LIBFILE) $(LIBS)
clean:
rm -f $(OBJECTS) $(EXAMPLES) $(LIBFILE)
PS2 : amqp.h contenant des consignes '_declspec(import)' :
https://github.com/alanxz/rabbitmq-c/blob/master/librabbitmq/amqp.h
que j'essaie actuellement de configurer (bidouiller serait plus juste) pour régler le problème d'importation/link de la fonction.
PS3 : J'essaie bien sûr d'avoir des réponses directement des devs de ces différents projets mais si quelqu'un peut résoudre, corriger ou expliquer rien qu'un bout de ce sujet il serait le bienvenu.
A voir également:
- Lier une .dll / .lib avec MinGW sous Win7(VS2010)
- Advapi32.dll ccleaner - Forum Windows 7
- Lier au précédent word ✓ - Forum Word
- Désactiver "identique au précédent". - Forum Word
- Win7 to usb - Télécharger - Systèmes d'exploitation
- Lier calendrier outlook et gmail - Guide
4 réponses
c:/mingcwc/::b//inmmi/inngg.ww.//bb/iinnli//b../..gcc///lliibbmin//gw3gg2cccc///4m.im6ni.gn2wg3w23/2/./4..46..6/2.2.//..../././.../...//.../..m/i/ng.w.32..///bm
imininnggw/w3322ld/./exbebiinn:// lldcd.a.enexnxeoet:: fciacnnadnnonto t - fiflnirdnadb b i-tm-qlral
baibtbmiqtmq
c
ollcecocoltll2le:ec ctt2l:2d : al ldrd ea t aor uerrtenotéuo ru1nr énc éo1 d 1ec ocddo'edé etd 'adté'é ttadat' ted x'dé'ecxeuéxtcéicuoutnti
oonn
C'est quoi ce charabia ?
ça ne devrait pas être -lrabbitmq.1 dans la ligne d'édition des liens de make ?
imininnggw/w3322ld/./exbebiinn:// lldcd.a.enexnxeoet:: fciacnnadnnonto t - fiflnirdnadb b i-tm-qlral
baibtbmiqtmq
c
ollcecocoltll2le:ec ctt2l:2d : al ldrd ea t aor uerrtenotéuo ru1nr énc éo1 d 1ec ocddo'edé etd 'adté'é ttadat' ted x'dé'ecxeuéxtcéicuoutnti
oonn
C'est quoi ce charabia ?
ça ne devrait pas être -lrabbitmq.1 dans la ligne d'édition des liens de make ?
sylv_brl
Messages postés
22
Statut
Membre
Oui en effet, mais en corrigeant ça (essais en appeler -lrabbitmq.1 ou en renommant sans le '.1' les fichiers librairie (.lib/.dll/.pbc/.exp) et en rajoutant '-lrabbitmq.1' dans le MakeFile à CPPFLAGS et CFLAGS, j'obtiens toujours du charabia qui comprend 'x64: No such file or directory' inscrit également à plusieurs autres lignes.
Je comprend qu'il râle. C'est quoi ce x64 qui traine ? si c'est pour spécifier du 64 bit, avec gcc, c'est "-m64"
attention de ne pas mélanger le compilateur de visual et celui de gnu.
attention de ne pas mélanger le compilateur de visual et celui de gnu.
Ok, finalement il fallait que j'ajoute le prefix 'lib' à mes .lib .dll 'rabbitmq' (en retirant le '.1' au passage et affichant les extensions dans les Options Dossiers Windows). J'avais déjà vu ça et essayé, mais j'avais d'autres erreurs à ce moment là... Comme mon MakeFile est regénéré par le .bat pendant mes tests, j'avais perdu cette modification depuis un moment. Pour l'instant, il ne crie plus, j'espère donc que la compilation a fonctionné.
J'ai maintenant, toujours dans le contexte du sujet, un problème pour lier la lib en ".a" générée à mon projet VS2010. Lors de la compilation sous VS2010, j'obtiens une erreur "impossible d'ouvrir libamqpcpp.a.lib"
-> en renommant directement l'extension ".a" par ".lib" j'obtiens de la même manière "impossible d'ouvrir libamqpcpp.lib" (cette technique fonctionne a priori avec certaines lib compilées en C, mais ici c'est C++)
-> en suivant la réponse de mloskot ici : https://stackoverflow.com/questions/2096519/from-mingw-static-library-a-to-visual-studio-static-library-lib , j'obtiens de erreurs "symboles non reconnus"
Voir ma modif ici avec ajout libamqpcpp.a et libgcc.a : http://picpaste.com/test_.a_lib_MSVC_2010-pRP1QAxH.JPG
-> en essayant de convertir la lib ".a" en ".lib" via .dll et .def comme ici : http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs
mais avec g++ au lieu de gcc j'obtiens
Quelqu'un sait-il comment je peux faire exactement pour utiliser une lib ".a" obtenu par MinGW(g++) dans un projet MSVC ? Ou avec une alternative ?
-> en renommant directement l'extension ".a" par ".lib" j'obtiens de la même manière "impossible d'ouvrir libamqpcpp.lib" (cette technique fonctionne a priori avec certaines lib compilées en C, mais ici c'est C++)
-> en suivant la réponse de mloskot ici : https://stackoverflow.com/questions/2096519/from-mingw-static-library-a-to-visual-studio-static-library-lib , j'obtiens de erreurs "symboles non reconnus"
Voir ma modif ici avec ajout libamqpcpp.a et libgcc.a : http://picpaste.com/test_.a_lib_MSVC_2010-pRP1QAxH.JPG
-> en essayant de convertir la lib ".a" en ".lib" via .dll et .def comme ici : http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs
mais avec g++ au lieu de gcc j'obtiens
c:\...\deps-vs2010-x64\amqp\amqpcpp>g++ -shared -o test.dll src/amqp.cpp -Wl, --output-def,test.dll, --out-implib,libamqpcpp.a
g++: erreur: unrecognized option '--output-def,lab.dll,'
g++: erreur: unrecognized option '--out-implib,libamqpcpp.a'
Quelqu'un sait-il comment je peux faire exactement pour utiliser une lib ".a" obtenu par MinGW(g++) dans un projet MSVC ? Ou avec une alternative ?
J'aimerais réussir ça car il s'agit en fait d'un projet avec énormément de dépendances et scripts automatisés (bcp trop gros pour moi qui débute sûrement, ce qui est aussi un autre problème, mais c'est le boulot et ça reste intéressant). J'aimerais donc au minimum changer le processus de compilation. Je n'ai pas fais le module complémentaire 'Live3DModule' qu'on essaye actuellement d'ajouter (visible dans la hiérarchie des projets sur l'image en lien çi-dessus), j'arrive en cours de route, toutes ces complications m'amenant ici.
Mais si il n'y a pas de solutions rapidement, comme tu le dis, je vais surement devoir trouver comment compiler un ensemble plus grand avec MinGW ou l'inverse avec compilateur Win, et si possible rajouter cet ensemble dans le projet Realxtend... je ne sais pas trop encore comment mais ça viendra.
Pour l'instant j'ai juste un peu changé ma ligne de compilation (solution de mloskot) avec ce résultat :
Mais si il n'y a pas de solutions rapidement, comme tu le dis, je vais surement devoir trouver comment compiler un ensemble plus grand avec MinGW ou l'inverse avec compilateur Win, et si possible rajouter cet ensemble dans le projet Realxtend... je ne sais pas trop encore comment mais ça viendra.
Pour l'instant j'ai juste un peu changé ma ligne de compilation (solution de mloskot) avec ce résultat :
c:\Users\Sylvain\naali-3dlive\deps-vs2010-x64\amqp\amqpcpp>g++ -shared -o test.dll src/amqp.cpp -Wl, -output-def=test.dll, -out-implib=libamqpcpp.a -Iinclude -Isrc -IC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/librabbitmq
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find : Invalid argument
collect2: ld a retourné 1 code d'état d'exécution
Oui ça semble mieux comme ça (...enfin ça change le résultat de moins). Je vois qu'il utilise des fichiers temporaires dans /temp pour compiler, je me renseignes si il n'y a pas moyen d'éviter ça :
c:\Users\Sylvain\naali-3dlive\deps-vs2010-x64\amqp\amqpcpp>g++ -shared -o test.dll src/amqp.cpp -Wl,-output-def=test.dll,-out-implib=libamqpcpp.a -Iinclude -Isrc -IC:\Users\Sylvain\naali-3dlive\deps-vs2010-x64\amqp\rabbitmq-c-rabbitmq-c-v0.3.0\librabbitmq
Creating library file: libamqpcpp.a
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x281): undefined reference to 'amqp_destroy_connection'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0xea5): undefined reference to 'amqp_new_connection'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0xecc): undefined reference to 'amqp_open_socket'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0xeec): undefined reference to 'amqp_destroy_connection'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0xf2e): undefined reference to 'AMQPException::AMQPException(std::string)'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0xf75): undefined reference to 'amqp_set_sockfd'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x1023): undefined reference to 'amqp_login'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x103c): undefined reference to 'amqp_destroy_connection'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x1059): undefined reference to 'AMQPException::AMQPException(amqp_rpc_reply_t_*)'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x10cf): undefined reference to 'AMQPExchange::AMQPExchange(amqp_connection_state_t_**, int)'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x1166): undefined reference to 'AMQPExchange::AMQPExchange(amqp_connection_state_t_**, int, std:
:string)'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x11ff): undefined reference to 'AMQPQueue::AMQPQueue(amqp_connection_state_t_**, int)'
C:\Users\Sylvain\AppData\Local\Temp\ccXIbST0.o:amqp.cpp:(.text+0x1296): undefined reference to 'AMQPQueue::AMQPQueue(amqp_connection_state_t_**, int, std::strin
g)'
collect2: ld a retourné 1 code d'état d'exécution