2012-04-28 22 views
11

Esto puede ser una pregunta de Visual Studio más que cualquier otra cosa ...
Estoy tratando de compilar a 0MQ C++ example usando VS10 y ZeroMQ 2.2.0.
Descargué el windows sources e intenté seguir these instructions para construir 0MQ estáticamente. Específicamente:vinculando a una biblioteca 0MQ estática en VS

  • conmutada a la Versión
  • para los 7 proyectos de la solución:
    • establece General\Configuration Type-Static library (.lib)
    • establecer C/C++\Code Generation\Runtime Library a Multi-threaded (/MT)
    • añadió ZMQ_STATIC a C/C++\Preprocessor\Preprocessor Definitions
  • Actualizado zmq.h y zmq_utils.h de modo que si _MSC_VER y ZMQ_STATIC se definen a continuación DLL_EXPORT también se definirá

En este punto parece 0MQ para construir así.

  • Creó un proyecto de consola vacía:
    • cambió a Soltar
    • añade un archivo CPP individual con el ejemplo vinculado anteriormente
      • cambiado random-rand, srandom a srand y snprintf a _snprintf
    • conjunto C/C++\Code Generation\Runtime Library a Multi-threaded (/MT)
    • añade ...\zeromq-2.2.0\include carpeta para C/C++\General\Additional Include Directories
    • añadió ...\zeromq-2.2.0\builds\msvc\Release\*.lib a Linker\Input\Additional Dependencies

Sin embargo sigo recibiendo los siguientes errores de enlace:

1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_bind 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_close 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_errno 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_init 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_data 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_strerror 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_socket 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_init_size 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_term 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_close 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_send 

¿Qué he perdido?

Respuesta

17

Debe agregar ZMQ_STATIC a C/C++\Preprocessor\Preprocessor Definitions en su "proyecto de consola vacía" también. De lo contrario, cuando se compila su aplicación, ZMQ_EXPORT en zmq.h se define como __declspec(dllimport), y como resultado, se ve MSVC para __imp__zmq_* símbolos en lugar de zmq_*

+0

Para aclarar, la definición de ZMQ_STATIC significa que no se usa ninguna de las marcas DLL (no se define __declspec (dllimport) o __declspec (dllexport)) –

1

es la vinculación muy importante para usted estática? Si no, puede probar la segunda respuesta por elnino_9 here. La elaboración de la respuesta de elnino_9:

  • Descargar el sources y descomprimir a alguna carpeta local (por ejemplo C: \ dev \ zeromq).
  • Vaya a C: \ dev \ zeromq-2.2.0 \ builds \ msvc y abra la solución msvc.sln. MS2010 actualizará de un VS2008 a un proyecto VS2010
  • Cree todos los proyectos.
  • La construcción debe generar los dos archivos siguientes:
    • C: \ dev \ zeromq \ lib \ libzmq.lib - esto es lo que se necesita para hacer referencia a las opciones del vinculador de su proyecto
    • C: \ dev \ zeromq_boaz \ builds \ msvc \ Release \ libzmq.dll - esto deberá copiar en la misma carpeta que el ejecutable de su proyecto para ejecutarlo (si su compilación se configuró en 'Debug', la ruta sería C: \ dev \ zeromq \ construye \ msvc \ depuración \ libzmq.dll)
  • Crear su solución y proyecto. Haga lo siguiente:
    • En el Explorador de soluciones, haga clic derecho en su proyecto y seleccione 'Propiedades' (en la parte inferior).
    • Navegue a 'C/C++ -> General -> Directorios de inclusión adicionales' y agregue C: \ dev \ zeromq \ include. Esto hará referencia a los archivos de encabezado de 0MQ.
    • Navegue a 'Enlazador -> Entrada -> Dependencias adicionales' y agregue la ruta completa al archivo 'libzmq.dll' del paso anterior.
    • Cree su proyecto: esto debería ir sin errores ahora.
  • Copie 'libzmq.dll' en la misma carpeta que su ejecutable; su proyecto debería ejecutarse ahora.

Algunos comentarios:

  • no estoy seguro de por qué es necesario hacer referencia al archivo 'libzmq.lib'. No es necesario para el ejecutable (puede eliminarlo, y seguirá ejecutándose, ya que la lógica necesaria reside en el dll). ¿Alguien puede explicar esto?
  • Observe una advertencia en el ejemplo para usuarios de Windows: la segunda declaración vinculante (publisher.bind("ipc://weather.ipc");) causará una excepción. Como se explica en here (aunque en letra pequeña), el transporte entre procesos no es compatible con Windows.

EDITAR

Creo que la respuesta a mi primer comentario se puede encontrar en MSDN:

", la función DLL Cuando el código fuente para el ejecutable que llama está compilado o ensamblado llamada genera una referencia de función externa en el código objeto. Para resolver esta referencia externa, la aplicación debe vincular con la biblioteca de importación (archivo .lib) proporcionada por el fabricante de la DLL ".

+0

La pregunta es específicamente sobre enlaces estáticos, por lo que no se debe usar la DLL. –

4

Tuve errores similares, no cuando trato de vincular estáticamente, sino simplemente intentando crear un proyecto de ZMQ y vincular los 'stubs' .lib para el dll.

En mi caso fue porque estaba tratando de vincular las bibliotecas de 64 bits en un proyecto de 32 bits. Descargué la versión incorrecta. Cuando obtuve los correctos, es decir, x86 en vez de x64, funcionó.

Cuestiones relacionadas