【问题标题】:linking to a static 0MQ library in VS链接到 VS 中的静态 0MQ 库
【发布时间】:2012-04-28 21:27:16
【问题描述】:

这可能是一个 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 更改为randsrandom 更改为srandsnprintf 更改为_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

我错过了什么?

【问题讨论】:

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


    【解决方案1】:

    您也应该在“空控制台项目”中将ZMQ_STATIC 添加到C/C++\Preprocessor\Preprocessor Definitions。否则,当你编译你的应用程序时,zmq.h 中的ZMQ_EXPORT 被定义为__declspec(dllimport),因此,MSVC 会寻找__imp__zmq_* 符号而不是zmq_*

    【讨论】:

    • 澄清一下,定义 ZMQ_STATIC 意味着不使用任何 DLL 标记(__declspec(dllimport) 或 __declspec(dllexport) 均未定义)
    【解决方案2】:

    我有类似的错误 - 不是在尝试静态链接时,而是在尝试创建 ZMQ 项目并为 dll 链接 .lib 'stubs'。

    就我而言,这是因为我试图将 64 位库链接到 32 位项目。我下载了错误的版本。当我得到正确的,即 x86 而不是 x64 时,它就起作用了。

    【讨论】:

    • 哇,感谢这条评论终于让我的工作顺利进行了。 (我的问题是相反的方向,当我需要 64 时构建 32 位)
    【解决方案3】:

    静态链接对您来说很重要吗?如果没有,您可以通过 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 - 您需要复制到与项目可执行文件相同的文件夹才能运行它(如果您的构建配置为“调试”,路径是 C:\dev\zeromq\builds\msvc\ Debug \libzmq.dll)
    • 创建您的解决方案和项目。请执行下列操作:
      • 在解决方案资源管理器中,右键单击您的项目,然后选择“属性”(位于最底部)。
      • 导航到“C/C++ --> 常规 --> 附加包含目录”并添加 C:\dev\zeromq\include。这将引用 0MQ 的头文件。
      • 导航到“链接器-->输入-->附加依赖项”,然后将完整路径添加到上一步中的“libzmq.dll”文件。
      • 构建您的项目 - 现在应该没有错误了。
    • 将“libzmq.dll”复制到与您的可执行文件相同的文件夹 - 您的项目现在应该可以运行了。

    一些cmets:

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

    编辑

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

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

    【讨论】:

    • 这个问题是关于静态链接的,所以不应该使用 DLL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多