Comment lier statiquement à l'aide de link.exe
J'ai essayé de lier statiquement à l'encontre d'une bibliothèque C++ appelée Poco sur Windows à l'aide de Visual Studio 2008 outils de ligne de commande.
- Je construire mon programme avec:
cl /I..\poco\lib /c myapp.cpp
link /libpath:..\poco\lib myapp.obj PocoNet.lib
Présente les résultats dans un fichier exe qui au moment de l'exécution nécessite PocoNet.dll et PocoFoundation.dll.
J'ai passé un certain temps à lire sur le lien Windows, et appris que cl /MT
lien statique à l'encontre de la bibliothèque standard, tandis que cl /MD
liens dynamiquement.
J'ai essayé de préciser les /MT
, mais qui ne semblent pas à changer quoi que ce soit; mon application exige toujours le Poco Dll. (Je pense aussi que /MT
est le comportement par défaut.)
Recherche dans le cadre de ..\poco\lib
, j'ai trouvé qu'il y avait aussi un PocoNetmt.lib, mais en précisant qu'au lieu de PocoNet.lib a entraîné un tas de messages d'erreur LNK2005 ("déjà défini"):
msvcprt.lib(MSVCP90.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in exp.obj
J'ai ensuite essayé d'empilement sur plusieurs indicateurs:
-
/verbose:lib
: utile pour voir ce qui se passe -
/Zl
: mêmes résultats qu'avant -
/nodefaultlib:libcmt.lib /nodefaultlib:msvcprt.lib
: j'ai cette erreur:PocoFoundationmt.lib(Exception.obj) : warning LNK4217: locally defined symbol ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ (public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)) imported in function __ehhandler$??0Exception@Poco@@QAE@ABV01@@Z
-
tomber la
.lib
au total, comme suggéré ici: même erreur que ci-dessus
J'ai aussi essayé quelques combinaisons de ce qui précède, en vain.
Des indices serait grandement apprécié. Mais tout aussi utile, serait tout pointeurs vers des ressources qui sont utiles pour le débogage (ou d'apprentissage) de ces types de problèmes.
OriginalL'auteur Yang | 2009-11-07
Vous devez vous connecter pour publier un commentaire.
Vous devez définir POCO_STATIC sur la ligne de commande et le lien avec les deux PocoFoundationmt et PocoNetmt.lib:
C:\test>cl /MD /WX /nologo /EHsc /DPOCO_STATIC /DUNICODE /D_UNICODE /I..\poco\Foundation\include /I ..\poco\Net\include /c exp.cpp
exp.cpp
C:\test> /lien libpath:..\poco\lib /WX /nologo exp.obj PocoNetmt.lib PocoFoundationmt.lib
[Mise à JOUR]
Si vous compilez avec /DPOCO_STATIC, alors il n'est pas nécessaire de spécifier le POCO bibliothèques sur la ligne de commande liens. Les fichiers d'en-tête contient #pragma comment(lib, "PocoXXXmt.lib") les états devraient s'assurer que toutes les bibliothèques nécessaires seront couplés.
Si vous n'avez pas compilé avec /DPOCO_STATIC, puis la DLL bibliothèques d'importation sera automatiquement lié à la place.
[/Mise à JOUR]
OriginalL'auteur Alex
Il semble que le problème est que le
PocoNet.lib
fichier est une bibliothèque d'importation pour l'poco.dll. Ainsi, le externs il résout ce sont à la DLL.Vous aurez besoin de trouver ou de construire une bibliothèque statique pour Poco (si possible).
PocoNetmt.lib
; c'est ce qu'ont commencé à me donner des erreurs de lien. (Le Poco système de build par défaut produit à la fois partagé et les bibliothèques statiques.)OriginalL'auteur Michael Burr
Vous aurez besoin /MT sur votre code et toutes ses dépendances à lier statiquement à MSVC runtime (MSVCP90.dll/MSVCR90.dll).
C'est parce que PocoNetmt.lib semble être de construire avec /MT.
Si avec /MT vous obtenez toujours msvcprt.lib, allumer /verbose et découvrez quels sont les autres bibliothèque traîne. Puis recompiler/trouver l'accumulation d'électricité statique.
Une autre option est de trouver statique PocoNet lib qui est construite avec /MD (afin de lier de manière statique, mais dynamique à l'exécution) et l'interrupteur tout à /MD.
EDIT:
Lorsque Poco dll est lié à /MT qui ne vous affecte pas. Mais puisque vous voulez vous en débarrasser, vous (et tous vos autres dépendances) devra utiliser les mêmes /MT de drapeau.
Je viens de recevoir une réponse de l'Poco liste de diffusion de me dire que, tout en en effet le PocoNetmt.lib est la liaison statique, le Poco libs eux-mêmes sont tous construits avec /MT, alors que j'avais encore besoin d'un lien dynamique avec la norme d'exécution libs - ce qui est bien. Je ne souhaite pas faire glisser la PocoNet.dll's avec moi, et c'est ce que je ne peux pas comprendre comment le faire.
/MT signifie que vous ne pas lien de dll runtime. /MD signifie que vous ne. Et ce drapeau doit être le même sur toutes les libs que vous liez.
Argh, désolé. Je le sais, je voulais écrire "sont tous construits avec /MD."
OriginalL'auteur Eugene
POCO >= 1.4.0 soutien statique avec statique d'exécution (et encore statique dynamique de l'exécution)
https://raw.github.com/pocoproject/poco/poco-1.4.5/CHANGELOG
(de la recherche pour "debug_static_mt")
ne pas oublier de définir POCO_STATIC lors de l'inclusion de poco-têtes
OriginalL'auteur franckspike