He intentado enlazar estáticamente con una biblioteca de C++ llamada Poco en Windows utilizando las herramientas de línea de comandos de Visual Studio 2008.Cómo enlazar estáticamente usando link.exe
construyo mi programa con:
cl /I..\poco\lib /c myapp.cpp
link /libpath:..\poco\lib myapp.obj PocoNet.lib
Esto se traduce en un exe que en tiempo de ejecución requiere PocoNet.dll y PocoFoundation.dll.
Pasé un tiempo leyendo sobre la vinculación en Windows, y aprendí que cl /MT
vincula estáticamente contra la biblioteca estándar, mientras que cl /MD
vincula dinámicamente.
Intenté especificar /MT
, pero eso no pareció cambiar nada; mi aplicación aún requiere las DLL Poco. (También sospecho que /MT
es el comportamiento por defecto.)
Mirando bajo ..\poco\lib
, encontré también había una PocoNetmt.lib, pero especificando que en lugar de PocoNet.lib dio lugar a un montón de errores LNK2005 ("ya está definido"):
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
luego trató la colocación sobre las más banderas:
/verbose:lib
: útil para ver lo que está pasando/Zl
: mismos resultados que antes/nodefaultlib:libcmt.lib /nodefaultlib:msvcprt.lib
: ya ha recibido este error: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
dejar caer el
.lib
por completo, as suggested here: mismo error que el anterior
también probé algunos combinaciones de los anteriores, todo fue en vano.
Cualquier pista sería muy apreciada. Pero igual de útiles serían los indicadores de los recursos que son útiles para depurar (o conocer) estos tipos de problemas.
Gracias. POCO_STATIC fue la clave. Recomiendo encarecidamente que este oculto conjuro sea más prominente en algún lugar de la documentación de alto nivel y en el archivo README. Cuando busca en Google POCO_STATIC, las únicas referencias al mismo se encuentran en publicaciones de blog. – Yang