这可能是一个Visual Studio问题,而不是其他任何问题...... 我正在尝试使用VS10和ZeroMQ 2.2.0构建a 0MQ C++ example 我下载了windows sources并尝试关注these instructions以便静态构建0MQ。具体做法是:
General\Configuration Type
设为Static library (.lib)
C/C++\Code Generation\Runtime Library
设为Multi-threaded (/MT)
ZMQ_STATIC
添加到C/C++\Preprocessor\Preprocessor Definitions
zmq.h
和zmq_utils.h
,以便在定义_MSC_VER
和ZMQ_STATIC
后,还会定义DLL_EXPORT
此时0MQ似乎构建良好。
random
更改为rand
,将srandom
更改为srand
,将snprintf
更改为_snprintf
C/C++\Code Generation\Runtime Library
设为Multi-threaded (/MT)
...\zeromq-2.2.0\include
文件夹添加到C/C++\General\Additional Include Directories
...\zeromq-2.2.0\builds\msvc\Release\*.lib
添加到Linker\Input\Additional Dependencies
但是我仍然收到以下链接错误:
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
我错过了什么?
答案 0 :(得分:17)
您也应该在“空控制台项目”中将ZMQ_STATIC
添加到C/C++\Preprocessor\Preprocessor Definitions
。否则,在编译应用程序时,ZMQ_EXPORT
中的zmq.h
被定义为__declspec(dllimport)
,因此,MSVC会查找__imp__zmq_*
个符号,而不是zmq_*
< / p>
答案 1 :(得分:4)
我有类似的错误 - 不是在尝试静态链接时,而只是尝试创建一个ZMQ项目并为dll链接.lib'存根'。
在我的情况下,这是因为我试图将64位库链接到32位项目。我下载了错误的版本。当我得到正确的,即x86而不是x64时,它可以工作。
答案 2 :(得分:2)
静态链接对您来说非常重要吗?如果没有,您可以尝试elnino_9 here的第二个答案。阐述elnino_9的答案:
一些意见:
publisher.bind("ipc://weather.ipc");
)将导致异常。正如here所解释的那样(虽然在精细打印中),Windows上不支持进程间传输。修改强>
我认为我的第一条评论的答案可以在MSDN中找到:
“当编译或汇编调用可执行文件的源代码时,DLL函数调用在目标代码中生成外部函数引用。要解析此外部引用,应用程序必须链接到导入库(.lib文件)由DLL的制造商提供。“