Ho cercato di eseguire il collegamento statico a una libreria C++ denominata Poco su Windows utilizzando gli strumenti della riga di comando di Visual Studio 2008.Come linkare staticamente utilizzando link.exe
costruisco il mio programma con:
cl /I..\poco\lib /c myapp.cpp
link /libpath:..\poco\lib myapp.obj PocoNet.lib
Ciò si traduce in un file EXE che in fase di esecuzione richiede PocoNet.dll e PocoFoundation.dll.
Ho passato un po 'di tempo a leggere i collegamenti in Windows e ho appreso che i collegamenti statici cl /MT
nella libreria standard, mentre i collegamenti cl /MD
in modo dinamico.
Ho provato a specificare /MT
, ma questo non sembra cambiare nulla; la mia app richiede ancora le DLL di Poco. (Ho il sospetto che anche /MT
è il comportamento di default.)
Guardando sotto ..\poco\lib
, ho trovato c'era anche un PocoNetmt.lib, ma precisando che invece di PocoNet.lib ha provocato una serie di errori LNK2005 ("già definito"):
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)" ([email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) already defined in exp.obj
allora ho provato impilamento su più bandiere:
/verbose:lib
: utile per vedere cosa sta succedendo/Zl
: stessi risultati come prima/nodefaultlib:libcmt.lib /nodefaultlib:msvcprt.lib
: ricevuti questo errore:PocoFoundationmt.lib(Exception.obj) : warning LNK4217: locally defined symbol [email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected] (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 [email protected]@@[email protected]@@Z
cadere il
.lib
tutto, as suggested here: stesso errore come sopra
ho anche provato alcuni combinazioni di quanto sopra, tutto inutilmente.
Qualsiasi indizio sarebbe molto apprezzato. Ma altrettanto utile sarebbe qualsiasi suggerimento alle risorse che sono utili per il debug (o l'apprendimento) di questi tipi di problemi.
Grazie. POCO_STATIC era la chiave. Consiglio vivamente di rendere questo incantesimo oscuro più prominente da qualche parte nella documentazione di alto livello e nel README. Quando usi Google per POCO_STATIC, i soli riferimenti ad esso sono nei post del blog. – Yang