Visual studio 2008 ZeroMQ和Visual C++;2008

Visual studio 2008 ZeroMQ和Visual C++;2008,visual-studio-2008,visual-c++,zeromq,Visual Studio 2008,Visual C++,Zeromq,我在新应用程序中尝试使用ZeroMQ时遇到问题。请注意:我下载和构建ZeroMQ本身没有问题。我下载了ZeroMQ ZIP文件,在Visual Studio/C++2008中打开了项目/解决方案文件,并很好地构建了ZeroMQ库。ZeroMQ安装文件夹的/lib目录包含.lib、.dll和其他文件,因此据我所知,这些文件都很好 我的问题是,我试图构建一个简单的项目,其中包含ZeroMQ用户指南中的HelloWorld服务器示例。我创建了以下名为helloserver.c的文件 // // Hel

我在新应用程序中尝试使用ZeroMQ时遇到问题。请注意:我下载和构建ZeroMQ本身没有问题。我下载了ZeroMQ ZIP文件,在Visual Studio/C++2008中打开了项目/解决方案文件,并很好地构建了ZeroMQ库。ZeroMQ安装文件夹的/lib目录包含.lib、.dll和其他文件,因此据我所知,这些文件都很好

我的问题是,我试图构建一个简单的项目,其中包含ZeroMQ用户指南中的HelloWorld服务器示例。我创建了以下名为helloserver.c的文件

//
// Hello World server
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"
//
#include <zmq.h>
#include <stdio.h>
#include <string.h>

int main (void)
{
zmq_msg_t request;
zmq_msg_t reply;

void *context = zmq_init (1);

// Socket to talk to clients
void *responder = zmq_socket (context, ZMQ_REP);
zmq_bind (responder, "tcp://*:5555");

while (1) {
// Wait for next request from client

    zmq_msg_init (&request);
    zmq_recvmsg (responder, &request, 0);
    printf ("Received Hello\n");
    zmq_msg_close (&request);

// Do some 'work'
    Sleep (1);

// Send reply back to client
    zmq_msg_init_size (&reply, 5);
    memcpy (zmq_msg_data (&reply), "World", 5);
    zmq_sendmsg (responder, &reply, 0);
    zmq_msg_close (&reply);
}
// We never get here but if we did, this would be how we end
zmq_close (responder);
zmq_term (context);
return 0;
}
//
//你好,世界服务器
//将REP套接字绑定到tcp://*:5555
//需要客户端的“你好”,回复为“世界”
//
#包括
#包括
#包括
内部主(空)
{
zmq_msg_t请求;
zmq_msg_t回复;
void*context=zmq_init(1);
//与客户端对话的套接字
void*responder=zmq_套接字(上下文,zmq_REP);
zmq_绑定(响应程序,“tcp://*:5555”);
而(1){
//等待客户端的下一个请求
zmq_msg_init(&request);
zmq_recvmsg(响应者和请求,0);
printf(“收到Hello\n”);
zmq_msg_关闭(&请求);
//做一些“工作”
睡眠(1);
//将回复发送回客户端
zmq_msg_初始大小(&reply,5);
memcpy(zmq_msg_数据和回复),“世界”,5;
zmq_sendmsg(应答器和应答器,0);
zmq_msg_关闭(&reply);
}
//我们从来没有到过这里,但如果我们做到了,这就是我们的结局
zmq_关闭(应答器);
zmq_术语(上下文);
返回0;
}
我将ZeroMQ安装包含目录添加到VC++2008包含路径(属性->配置属性->C/C++->常规->其他包含目录),并将ZeroMQ lib目录添加到项目中: (属性->配置属性->C/C++->代码生成->运行时库,选择多线程调试DLL/MDd)

我试图建立这个项目。所有的编译都很好,但是链接时会得到一堆未解析的外部,如:

1> 链接。。。 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_函数_main中引用的术语 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_关闭在函数_main中引用 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_sendmsg在函数_main中引用 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_msg_函数_main中引用的数据 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_msg_init_函数_main中引用的大小 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_msg_关闭在函数_main中引用 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_recvmsg在函数_main中引用 1> helloserver.obj:错误LNK2019:未解析的外部符号_imp_zmq_msg_init在函数_main中引用 1> helloserver.obj:错误LNK2019:函数_main中引用了未解析的外部符号_imp_zmq_bind 1> helloserver.obj:错误LNK2019:函数_main中引用了未解析的外部符号_imp_zmq_套接字 1> helloserver.obj:错误LNK2019:函数_main中引用了未解析的外部符号_imp_zmq_init 1> C:\work\visualc++2008\projects\HelloZMQServer\Debug\HelloZMQServer.exe:致命错误LNK1120:11个未解析的外部

我尝试返回代码生成->运行时库设置,并尝试将库开关更改为?MD或/MT,但没有任何效果,我仍然收到这些链接器错误

请注意,当我创建helloworld.c时,我使用了一个空的windows控制台应用程序项目,我所做的唯一更改是添加ZeroMQ include和lib目录,如上所示。我没有更改任何其他默认项目设置。我猜我错过了某个项目的背景


如何修复此问题?

您没有提到您还将混凝土库添加到项目中。请注意,仅告诉VS库路径是不够的,但还必须将库本身添加到项目中。我现在手头没有Visual Studio,但您可以在项目的链接器设置中找到此选项。在这里,您可以提到所有要链接的库。

添加ZMQ库路径(安装ZMQ库的路径\zeromq-2.1.10\lib) 您的项目:

项目->属性->链接器->常规->附加库目录

还将libzmq.lib添加到

项目->属性->链接器->输入->其他依赖项

有趣的是,您的项目中需要有libzmq.dll的副本,否则当您运行项目时,调试器会抱怨“找不到libzmq.dll”。仍在寻找解决办法


注意:这是我在VisualStudio2010中运行zmq代码的方法。应该也适用于VS2008。

当我遇到类似错误时,是因为我试图将64位库链接到32位项目中。我下载了错误的版本。当我得到正确的解决方案(即x86而不是x64)时,它工作了。

另外请注意,我通过双击ZeroMQ自己的解决方案文件来构建ZeroMQ,因此我将其构建为自己的独立解决方案。我的HelloWorld项目在它自己的HelloWorld解决方案中。我是否需要将ZeroMQ库引入与HelloWorld相同的解决方案中,以便正确构建它?如果是这样,我该怎么做呢?哦,是的,我已经将ZeroMQ库路径添加到我的HellowOrld项目中(项目->引用->添加路径)。我可以添加路径,但会弹出“添加新引用”窗口,其中没有任何内容。好的,我通过将ZeroMQ项目libzmq添加到新的HelloWorld解决方案中来实现这一点。我终于能够看到libzmq显示为一个我可以在addnewreference窗口中添加的引用。它现在链接ok。如果一个人用VC++创建一个解决方案,他必须在这个解决方案中包含外部库项目,以及你自己的用户项目,这是真的吗?我觉得这有点傻。这也是我的解决办法。我认为链接器能够重新编码