2009-11-07 58 views
16

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:

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.

Respuesta

15

tiene que definir POCO_STATIC en la línea de comandos y el enlace con los dos PocoFoundationmt y PocoNetmt.lib:

C: \ test> cl/MD/WX/nologo/EHsc/DPOCO_STATIC/DUNICODE/D_UNICODE/I. . \ Poco \ Fundación \ include/I .. \ Poco \ Net \ include/c exp.cpp

exp.cpp

C: \ test> enlace /libpath:..\poco\lib/WX/nologo exp.obj PocoNetmt.lib PocoFoundationmt.lib

[ACTUALIZACIÓN] Si compila wi th/DPOCO_STATIC, entonces no es necesario especificar las bibliotecas POCO en la línea de comando del enlazador. Los archivos de cabecera contiene #pragma comment (lib, "PocoXXXmt.lib") declaraciones que deben garantizar que todas las librerías necesarias estarán conectados en.

Si no compila con/DPOCO_STATIC, a continuación, las bibliotecas de importación DLL ser vinculado automáticamente en su lugar. [/ ACTUALIZACIÓN]

+2

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

5

Parece que el problema es que el archivo PocoNet.lib es una biblioteca de importación para poco.dll. Entonces, los externos que resuelve son a la DLL.

Deberá encontrar o crear una biblioteca estática para Poco (si es posible).

+0

¿Pero cómo puedo verificar esto? Mencioné que finalmente encontré y cambié a 'PocoNetmt.lib'; eso es lo que comenzó a darme errores de enlace. (El sistema de compilación Poco produce de forma predeterminada tanto libs compartidos como estáticos.) – Yang

0

Necesitará/MT en su código y todas sus dependencias para enlazar estáticamente al tiempo de ejecución de MSVC (MSVCP90.dll/MSVCR90.dll).

Eso es porque PocoNetmt.lib parece estar compilado con/MT.

Si con/MT aún obtiene msvcprt.lib, active/verbose y descubra qué otra biblioteca lo arrastra. Luego recompile/encuentre la construcción estática de eso.

Otra opción es encontrar lib estáticas de PocoNet creadas con/MD (para que se enlace estáticamente a ellas, pero dinámicamente a tiempo de ejecución) y cambiar todo a/MD.

EDITAR: Cuando Poco dll está vinculado con/MT que no le afecta. Pero como quiera deshacerse de él, usted (y todas sus otras dependencias) tendrá que usar la misma bandera/MT.

+0

CAPCHA: anal worthier. Ve figura ... – Eugene

+0

Acabo de recibir una respuesta de la lista de correo de Poco que me dice que, aunque el PocoNetmt.lib es para enlaces estáticos, las libs de Poco están todas compiladas con/MT, por lo que aún necesito dinámicamente vincular con las librerías de tiempo de ejecución estándar, lo cual está bien. Simplemente no deseo arrastrar los archivos PocoNet.dll conmigo, y eso es lo que no sé cómo hacer. – Yang

+0

/MT significa que usted no tiene un enlace a las DLL de tiempo de ejecución./MD significa que sí. Y este indicador debe ser el mismo en todas las bibliotecas a las que se vincula. – Eugene

Cuestiones relacionadas