链接到VS中的静态0MQ库

时间:2012-04-28 21:27:16

标签: visual-studio static-libraries static-linking zeromq

这可能是一个Visual Studio问题,而不是其他任何问题...... 我正在尝试使用VS10和ZeroMQ 2.2.0构建a 0MQ C++ example 我下载了windows sources并尝试关注these instructions以便静态构建0MQ。具体做法是:

  • 切换到发布
  • 对于解决方案中的所有7个项目:
    • General\Configuration Type设为Static library (.lib)
    • C/C++\Code Generation\Runtime Library设为Multi-threaded (/MT)
    • ZMQ_STATIC添加到C/C++\Preprocessor\Preprocessor Definitions
  • 更新了zmq.hzmq_utils.h,以便在定义_MSC_VERZMQ_STATIC后,还会定义DLL_EXPORT

此时0MQ似乎构建良好。

  • 创建一个空的控制台项目:
    • 切换到发布
    • 添加了一个cpp文件,其中包含上面链接的示例
      • 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

我错过了什么?

3 个答案:

答案 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的答案:

  • 下载sources并解压缩到某个本地文件夹(例如C:\ dev \ zeromq)。
  • 转到C:\ dev \ zeromq-2.2.0 \ builds \ msvc并打开msvc.sln解决方案。 MS2010将从VS2008升级到VS2010项目
  • 构建所有项目。
  • 构建应该生成以下两个文件:
    • C:\ dev \ zeromq \ lib \ libzmq.lib - 这是您需要在项目的链接器选项中引用的内容
    • C:\ dev \ zeromq_boaz \ builds \ msvc \ Release \ libzmq.dll - 您需要将其复制到项目可执行文件所在的文件夹中才能运行它(如果您的构建配置为'Debug',路径为C:\ dev \ zeromq \ builds \ msvc \ Debug \ libzmq.dll)
  • 创建您的解决方案和项目。请执行下列操作:
    • 在解决方案资源管理器中,右键单击您的项目,然后选择“属性”(位于最底部)。
    • 导航至'C / C ++ - &gt;一般 - &gt;附加包含目录'并添加C:\ dev \ zeromq \ include。这将引用0MQ的头文件。
    • 导航至'链接器 - &gt;输入 - &gt; “附加依赖项”并添加上一步“libzmq.dll”文件的完整路径。
    • 构建您的项目 - 现在应该没有错误。
  • 将'libzmq.dll'复制到与可执行文件相同的文件夹中 - 您的项目现在应该运行。

一些意见:

  • 我不确定为什么你需要引用'libzmq.lib'文件。可执行文件不需要它(您可以删除它,它仍然会运行,因为必要的逻辑驻留在dll中)。有人可以解释一下吗?
  • 请注意Windows用户示例中的一个警告 - 第二个绑定语句(publisher.bind("ipc://weather.ipc");)将导致异常。正如here所解释的那样(虽然在精细打印中),Windows上不支持进程间传输。

修改

我认为我的第一条评论的答案可以在MSDN中找到:

  

“当编译或汇编调用可执行文件的源代码时,DLL函数调用在目标代码中生成外部函数引用。要解析此外部引用,应用程序必须链接到导入库(.lib文件)由DLL的制造商提供。“