2013-02-02 5 views
9

Je tente de créer un programme avec des bibliothèques d'outils chaînées liées statiquement. Je passe:Liaison statique avec libwinpthread

LDFLAGS="-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -static-libgcc -static-libstdc++" 

mais le programme lié à libwinpthread-1.dll partagé.

Qu'est-ce que je fais mal?

La seule façon d'obtenir des libwinpthreads statiques est de passer le -static à LDFLAGS. Mais il brise les programmes de construction avec le système de plugin.

J'utilise MinGW-w64 + GCC-4.7.2 du projet MinGW-construit: http://sourceforge.net/projects/mingwbuilds/

+1

Je ne sais pas pourquoi l'option '-Bstatic' ne semble pas fonctionner, mais vous pouvez probablement obtenir ce que vous voulez en spécifiant le fichier de bibliothèque spécifique au lieu de laisser la recherche' de ld' pour elle: http : //stackoverflow.com/a/14494371/12711 –

+2

Dans ma distribution MinGW l'archive statique est appelée 'libpthread.a' (oui, la dynamique est aussi' libwinpthread-1.dll'), donc je préfère utiliser '-lpthread'.Probablement la même chose est valable pour le vôtre. –

+0

Copie possible de [comment faire une liaison statique de libwinpthread-1.dll dans mingw?] (Https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll -in-mingw) –

Répondre

1

Vous ne faites rien incorrect, Mingw-Builds fonctionne de cette façon que vous.

Je suis récemment tombé sur, mais pour une autre raison:

Mingw-Builds liens automatiquement executables GCC bibliothèques dynamiques (libwinpthread-1.dll, libstdC++ - 6.dll, libgcc_s_dw2-1.dll) à sauver la taille exécutable (problème: quand vous libérez des exécutables vous devez vous rappeler d'ajouter des DLLs manquantes aussi avec votre binaire parce qu'il n'y a aucune garantie que les utilisateurs ont ces DLL sur leurs systèmes)

Dans mon cas le problème était que j'avais plusieurs GCC pakcages sur le même système et donc je ne les ai pas ajouté à PATH pour éviter les conflits de noms. La partie amusante est que CMAKE avant de configurer votre projet génère un C-SourceFile qui est compilé et utilisé pour obtenir des informations sur votre compilateur, puisque les DLL n'étaient pas dans PATH, ce petit exécutable généré par CMake plantait à cause des DLL manquantes et cela a arrêté tout le processus de construction.

La solution à corriger est d'ajouter le chemin du compilateur à PATH TEMPORARILY (ou mieux de lancer CMake dans un autre environnement).

Ajout DLL manuellement dans le répertoire temporaire Cmake ne fonctionne pas parce que le nettoyage Cmake ce répertoire à chaque configuration ..

Si vous utilisez mingwbuilds vous devez créer un lien vers pthreadBLAH.dll aucune solution

7

Try this :

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic 

Notez que le -lstdc++ avant -lpthread. Cela a fonctionné pour moi.

Assurez-vous d'ajouter ceci à la toute fin de votre ligne de commande g++.

+0

a fonctionné pour moi: gcc 4.9.2 sur x64 – cap

+0

Pourquoi -lstdC++ avant -lpthread quand nous avons déjà -static-libstdC++ ?? –

+0

@ kawing-chiu je ne sais pas. Cela fonctionne juste, et si je change l'ordre il casse. ;-) –

0

Pas idéal mais si cela ne vous dérange pas de placer vos DLL d'exécution dans le même répertoire que votre exécutable, vous pouvez ajouter quelque chose comme ceci dans votre fichier CMakeLists.txt. Cela copiera les DLL nécessaires à partir du répertoire bin MingW dans le répertoire de construction en cours.

# ... 
# change to name of your project 
set(TARGET_NAME ${PROJECT_NAME}) 
# change to path to your minw bin directory 
set(MINGW_BIN_PATH "C:\\Program Files\ \(x86\)\\mingw-w64\\i686-4.9.2-posix-dwarf-rt_v3-rev1\\mingw32\\bin") 

set(LIBGCC_DLL "${MINGW_BIN_PATH}\\libgcc_s_dw2-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBGCC_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBSTDCPP_DLL "${MINGW_BIN_PATH}\\libstdc++-6.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBSTDCPP_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBWINPTHREAD_DLL "${MINGW_BIN_PATH}\\libwinpthread-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBWINPTHREAD_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
Questions connexes