2009-11-07 19 views
16

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:

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.

risposta

15

è necessario definire POCO_STATIC sulla riga di comando e il collegamento sia con PocoFoundationmt e 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> Link /libpath:..\poco\lib/WX/nologo exp.obj PocoNetmt.lib PocoFoundationmt.lib

[UPDATE] Se si compila wi th/DPOCO_STATIC, quindi non è necessario specificare le librerie POCO sulla riga di comando del linker. I file di intestazione contengono istruzioni #pragma (lib, "PocoXXXmt.lib") che dovrebbero assicurare che tutte le librerie necessarie siano collegate.

Se non si compila con/DPOCO_STATIC, le librerie di importazione DLL essere automaticamente collegati. [/ UPDATE]

+2

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

5

Sembra che il problema sia che il file PocoNet.lib è una libreria di importazione per il poco.dll. Quindi gli esterni che risolve sono alla DLL.

È necessario trovare o creare una libreria statica per Poco (se possibile).

+0

Ma come posso verificarlo? Ho detto che alla fine ho trovato e passato a "PocoNetmt.lib"; questo è quello che ha iniziato a darmi errori di collegamento. (Per impostazione predefinita, il sistema di creazione di Poco produce sia librerie condivise che statiche.) – Yang

0

È necessario/MT sul proprio codice e tutte le sue dipendenze per il collegamento statico al runtime MSVC (MSVCP90.dll/MSVCR90.dll).

Questo perché PocoNetmt.lib sembra essere compilato con/MT.

Se con/MT si ottiene ancora msvcprt.lib, attivare/dettagliato e scoprire quale altra libreria lo trascina. Quindi ricompila/trova la build statica di quello.

Un'altra opzione è trovare la lib PoofNet che è stata costruita con/MD (quindi si collega staticamente ad essa, ma dinamicamente in runtime) e passare tutto a/MD.

MODIFICA: Quando Poco dll è collegato con/MT che non influisce su di te. Ma dal momento che vuoi eliminarlo, tu (e tutte le tue dipendenze) dovranno usare lo stesso flag/MT.

+0

CAPCHA: analy ofer. Vai a ... – Eugene

+0

Ho appena ricevuto una risposta dalla mailing list di Poco che mi dice che, sebbene il PocoNetmt.lib sia per il collegamento statico, le librerie Poco stesse sono tutte costruite con/MT, quindi avrei ancora bisogno di un comando dinamico collegamento con le librerie di runtime standard - che va bene. Non voglio trascinare il PocoNet.dll con me, ed è quello che non riesco a capire come fare. – Yang

+0

/MT significa che non si collega alle DLL di runtime./MD significa che lo fai. E questo flag deve essere lo stesso su tutte le librerie a cui ti colleghi. – Eugene

Problemi correlati