linking to a static 0MQ library in VS

Jonathan picture Jonathan · Apr 28, 2012 · Viewed 8.9k times · Source

This may be a Visual Studio question more than anything else...
I'm trying to build a 0MQ C++ example using VS10 and ZeroMQ 2.2.0.
I downloaded the windows sources and tried to follow these instructions in order to build 0MQ statically. Specifically:

  • Switched to Release
  • For all 7 projects in the solution:
    • set General\Configuration Type to Static library (.lib)
    • set C/C++\Code Generation\Runtime Library to Multi-threaded (/MT)
    • added ZMQ_STATIC to C/C++\Preprocessor\Preprocessor Definitions
  • Updated zmq.h and zmq_utils.h so that if _MSC_VER and ZMQ_STATIC are defined then DLL_EXPORT will also be defined

At this point 0MQ seems to build well.

  • Created an empty console project:
    • switched to Release
    • added a single cpp file with the example linked above
      • changed random to rand, srandom to srand and snprintf to _snprintf
    • set C/C++\Code Generation\Runtime Library to Multi-threaded (/MT)
    • added ...\zeromq-2.2.0\include folder to C/C++\General\Additional Include Directories
    • added ...\zeromq-2.2.0\builds\msvc\Release\*.lib to Linker\Input\Additional Dependencies

However I still receive the following linking errors:

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

What have I missed?

Answer

vond picture vond · Apr 29, 2012

You should add ZMQ_STATIC to C/C++\Preprocessor\Preprocessor Definitions in your "empty console project" too. Otherwise, when you compile your application, ZMQ_EXPORT in zmq.h is defined as __declspec(dllimport), and as a result, MSVC looks for __imp__zmq_* symbols instead of zmq_*