VS2013错误:尝试构建ZeroMQ服务器时出现LNK2019错误

4

我正在尝试在Visual Studio 2013上使用C++构建这个简单的ZeroMQ服务器。

#include "stdafx.h"
#include "zmq.hpp"
#include <string>
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    // Prepare context and socket
    zmq::context_t ctx(1);
    zmq::socket_t sckt(ctx, ZMQ_REP);
    sckt.bind("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        // Wait for next request from client
        sckt.recv(&request);
        std::cout << "Received Hello" << endl;
        Sleep(1);

        // Send reply back to client
        zmq::message_t reply(5);
        memcpy((void*)reply.data(), "World", 5);
        sckt.send(reply);
    }
    return EXIT_SUCCESS;
}

然而,当我尝试构建VS项目时,我会遇到LNK2019错误。以下是编译器输出:
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_errno referenced in function "public: __thiscall zmq::error_t::error_t(void)" (??0error_t@zmq@@QAE@XZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_strerror referenced in function "public: virtual char const * __thiscall zmq::error_t::what(void)const " (?what@error_t@zmq@@UBEPBDXZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_ctx_new referenced in function "public: __thiscall zmq::context_t::context_t(int,int)" (??0context_t@zmq@@QAE@HH@Z)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_ctx_set referenced in function "public: __thiscall zmq::context_t::context_t(int,int)" (??0context_t@zmq@@QAE@HH@Z)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_ctx_destroy referenced in function "public: void __thiscall zmq::context_t::close(void)" (?close@context_t@zmq@@QAEXXZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_msg_init referenced in function "public: __thiscall zmq::message_t::message_t(void)" (??0message_t@zmq@@QAE@XZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_msg_init_size referenced in function "public: __thiscall zmq::message_t::message_t(unsigned int)" (??0message_t@zmq@@QAE@I@Z)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_msg_send referenced in function "public: bool __thiscall zmq::socket_t::send(class zmq::message_t &,int)" (?send@socket_t@zmq@@QAE_NAAVmessage_t@2@H@Z)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_msg_recv referenced in function "public: bool __thiscall zmq::socket_t::recv(class zmq::message_t *,int)" (?recv@socket_t@zmq@@QAE_NPAVmessage_t@2@H@Z)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_msg_close referenced in function "public: __thiscall zmq::message_t::~message_t(void)" (??1message_t@zmq@@QAE@XZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_msg_data referenced in function "public: void * __thiscall zmq::message_t::data(void)" (?data@message_t@zmq@@QAEPAXXZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_socket referenced in function "public: __thiscall zmq::socket_t::socket_t(class zmq::context_t &,int)" (??0socket_t@zmq@@QAE@AAVcontext_t@1@H@Z)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_close referenced in function "public: void __thiscall zmq::socket_t::close(void)" (?close@socket_t@zmq@@QAEXXZ)
1>ZeroMQServer.obj : error LNK2019: unresolved external symbol __imp__zmq_bind referenced in function "public: void __thiscall zmq::socket_t::bind(char const *)" (?bind@socket_t@zmq@@QAEXPBD@Z)
1>D:\[ Source Code ]\C++\ZeroMQServer\Debug\ZeroMQServer.exe : fatal error LNK1120: 14 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我已安装ZeroMQ二进制文件v4.0.4并更新了VS项目属性,以指向ZeroMQ的包含和库路径。具体来说,这是我在项目属性中更新的内容(我怀疑其中一些设置可能是多余的):
  1. 配置属性>VC++目录>包含目录:添加'$(ZEROMQ_HOME)\include'
  2. 配置属性>VC++目录>库目录:添加'$(ZEROMQ_HOME)\lib'
  3. 配置属性>C/C++>常规>其他包含目录:添加'$(ZEROMQ_HOME)\include'
  4. 配置属性>链接器>输入>其他依赖项:添加'libzmq-v120-mt-4_0_4.lib;libzmq-v120-mt-gd-4_0_4.lib'
我使用的是Win 7, 64位版本。 请帮助我解决这个问题。
3个回答

6
根据 zeromq.org 上的库名称,您正在尝试链接两次相同的库:首先是发布版本,然后是调试版本。
请从您的发布配置中删除 libzmq-v120-mt-gd-4_0_4.lib,并从您的调试配置中删除 libzmq-v120-mt-4_0_4.lib
[编辑]
您的应用程序可能是32位的,而您正在尝试链接的库是64位的。(您可以使用dumpbin来确定.lib文件的体系结构,请参见此答案的示例。)请使用32位库或将您的应用程序更改为64位。

谢谢您的回复,但问题仍然存在。我是否还有其他不知道的ZeroMQ库依赖项? - oxycode
没有其他依赖项。第一个未解决的外部符号 zmq_errno 应该存在于 libzmq 本身中:http://api.zeromq.org/4-0:zmq-errno。你重新构建了吗?你的路径名中没有奇怪的字符,对吧? - KompjoeFriek
是的,我进行了重建。不过,路径名中没有任何奇怪的字符。 :) - oxycode
2
啊,我现在明白了。你的应用程序可能是32位的,而你试图链接的库是64位的。(你可以使用dumpbin来确定.lib文件的架构,参见https://dev59.com/gnA75IYBdhLWcg3wYYBQ)。请使用32位的库,或将你的应用程序改为64位。 - KompjoeFriek
1
我查看了配置(第4项),并注意到一个错误。该错误是由于另一个配置错误引起的(32位应用程序,64位库)。我会更新我的答案以反映这一点。 - KompjoeFriek
显示剩余3条评论

1

我需要定义ZMQ_STATIC,因为我想静态链接zmq。

默认情况下,所有这些函数都被定义为

# elif defined DLL_EXPORT

# 定义ZMQ_EXPORT __declspec(dllexport)


0

我也遇到了相同的错误。但对我来说,这是由于错误的函数调用约定导致的。 (只是想在这里提一下,因为它让我花费了一个多小时去追踪。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接