【ZMQ教程】使用VS2017编译ZMQ开源库

1. 概述

ZeroMQ(Zero Message Queue)是一个开源的高性能消息传递库,用于实现异步消息传递和多线程通信。支持跨平台,可在多种操作系统环境下使用。
本教程主要为Windows操作系统下使用Visual Studio 2017来编译ZMQ源码,其编译过程较为复杂,中途可能会出现很多报错,需要一步一步仔细的去分析并处理这些问题,一套流程下来,基本上是可以成功编译的。内容虽繁琐,但也是一个学习的过程。

2. 下载zmq源码

通过官网下载zmq源码,本次教程中所使用的版本为V4.3.2,该版本不是最新也不至于太旧,适合项目中使用。下载连接为:zmq v4.3.2

3. 打开项目并编译

zmq官方提供了VS编译的途径,目前支持最新的VS版本为VS2017。源码下载完毕后解压到指定位置,找到项目工程文件并使用VS2017打开项目。
在这里插入图片描述

(1)找到并打开工程

工程的位置:..\libzmq-4.3.2\builds\deprecated-msvc\vs2017\
工程文件:libzmq.sln
使用VS2017打开项目工程文件libzmq-4.3.2\builds\deprecated-msvc\vs2017\libzmq.sln
在这里插入图片描述

(2)编译libzmq项目

打开后在解决方案中可以看到7个项目,首先编译libzmq项目,右键该项目,点击生成。
不出意外的话,这一步会报错😂,接着往下看。
在这里插入图片描述

4. 报错解决:找不到windows SDK版本8.1

错误信息:找不到windows SDK版本8.1

在这里插入图片描述
解决方法更换Windows SDK版本选择10.0版本,记得将编译平台设置为x64,我们需要的是64位环境编译,如果需要32位的库则选Win32编译。
在这里插入图片描述
设置好后继续编译libzmq项目。

5. 报错解决:None of the ZMQ_IOTHREAD_POLLER_USE_*

错误信息:错误 C1189 #error: None of the ZMQ_IOTHREAD_POLLER_USE_* macros defined (编译源文件 ..\..\..\..\src\devpoll.cpp) libzmq d:\cpp_env\libzmq-4.3.2\src\poller.hpp

这个错误表明在编译源文件 devpoll.cpp 时,没有定义任何 ZMQ_IOTHREAD_POLLER_USE_* 宏。

这些宏通常用于指定 ZeroMQ 库中的 I/O 线程轮询器(I/O Thread Poller)的实现。I/O 线程轮询器是 ZeroMQ 库中的一个组件,用于处理底层的 I/O 事件,比如套接字的可读或可写事件。

要解决这个错误,你需要在编译源文件之前确保定义了适当的宏。你可以根据你的需求,在编译命令中定义一个适当的宏,这些宏的具体定义取决于你所使用的操作系统和编译环境。

出现该报错原因是缺少下面两个宏定义
ZMQ_IOTHREAD_POLLER_USE_SELECT
ZMQ_POLL_BASED_ON_SELECT
将这两个宏定义添加到项目中,在libzmq属性页 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义
点击编辑,将上面两个宏定义粘贴进去。
在这里插入图片描述
继续编译。

6. 报错解决:C3646 “_cond_var”: 未知重写说明符

错误信息:错误 C3646 “_cond_var”: 未知重写说明符 (编译源文件 ..\..\..\..\src\mailbox_safe.cpp) libzmq d:\cpp_env\libzmq-4.3.2\src\mailbox_safe.hpp

在这里插入图片描述
双击该错误,可以定位到mailbox_safe.hpp文件,该变量的定义位置condition_variable_t _cond_var
在这里插入图片描述
可以看到该_cond_var变量在此处是被申明了,那么为什么在编译报错未申明呢?
按住ctrl点击进去condition_variable_t类的实现
在这里插入图片描述
其实在这里已经发现了问题所在,这个condition_variable_t类的定义是处于条件编译分支中,取决于对应的宏有没有被定义

zmq支持的宏有:
ZMQ_USE_CV_IMPL_NONE: 这意味着不使用条件变量。这通常意味着你要使用其他方式来实现线程同步,或者你的应用程序只有单个线程。
ZMQ_USE_CV_IMPL_WIN32API: 这个宏指示ZMQ使用Windows操作系统提供的条件变量实现。
ZMQ_USE_CV_IMPL_STL11: 这表示ZMQ使用C++11标准库中提供的条件变量实现。
ZMQ_USE_CV_IMPL_VXWORKS: 这是指示在VxWorks实时操作系统上使用的条件变量实现。
ZMQ_USE_CV_IMPL_PTHREADS: 这个宏表示ZMQ将使用POSIX线程库(pthread)提供的条件变量实现。

这些宏是ZeroMQ (ZMQ) 库用于控制条件变量实现的选项。条件变量是一种线程间同步的机制,它允许线程在满足某个特定条件之前等待。不同的操作系统和库提供了不同的条件变量实现。你可以根据你的目标平台和需求选择合适的条件变量实现。

因此在项目的宏定义中添加上对应的宏即可,这里选取第二个宏,将其添加至预处理器定义中。
在这里插入图片描述
继续编译。

7. 报错解决:无法解析的外部符号 "struct zmq::endpoint_uri_pair_t __cdecl

错误信息:错误 LNK2019 无法解析的外部符号 "struct zmq::endpoint_uri_pair_t __cdecl zmq::make_unconnected_connect_endpoint_pair(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?make_unconnected_connect_endpoint_pair@zmq@@YA?AUendpoint_uri_pair_t@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 "public: int __cdecl zmq::socket_base_t::connect(char const *)" (?connect@socket_base_t@zmq@@QEAAHPEBD@Z) 中被引用	libzmq	D:\CPP_ENV\libzmq-4.3.2\builds\deprecated-msvc\vs2017\libzmq\socket_base.obj

在这里插入图片描述
这个错误(LNK2019)通常是链接错误,表明编译器找不到对应的函数或变量的定义。在这种情况下,编译器无法找到函数zmq::make_unconnected_connect_endpoint_pair的定义,该函数在zmq::socket_base_t::connect中被引用。

解决办法:在libzmq-4.3.2\src找到对应的依赖文件并引入项目中
在项目src\include目录中添加现有项:

endpoint.hpp
stream_listener_base.hpp
stream_connecter_base.hpp
ip_resolver.hpp

在项目src目录中添加现有项:

endpoint.cpp
stream_listener_base.cpp
stream_connecter_base.cpp
ip_resolver.cpp

继续编译。

8. libzmq项目编译通过

在这里插入图片描述

9. 重新生成整个解决方案

右键解决方案,重解决方案目标
在这里插入图片描述
生成解决方案。

10. 报错解决:无法打开文件“libzmq.lib”

错误信息:错误 LNK1104 无法打开文件“libzmq.lib” inproc_lat D:\CPP_ENV\libzmq-4.3.2\builds\deprecated-msvc\vs2017\inproc_lat

在这里插入图片描述
错误原因是无法链接到生成libzmq.lib

解决方案:修改项目配置文件zmq库链接路径,该配置文件路径为:libzmq-4.3.2\builds\deprecated-msvc\vs2017\libzmq.import.props
..\libzmq\该路径去掉。
在这里插入图片描述
重新生成解决方案
在这里插入图片描述

11. 编译成功

zmq目录\libzmq-4.3.2\bin\x64\Debug\v141\dynamic下会生成两个库文件:

libzmq.dll
libzmq.lib

引入到需要使用的项目即可。

  • 20
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,要在VS2017中配置ZMQ,首先需要下载ZMQ的正式版本,可以从https://github.com/zeromq/libzmq/releases下载libzmq的压缩文件。将文件解压到指定文件夹中,比如D:\zeromq。然后使用VS2017打开工程文件" D:\zeromq\zeromq-4.2.5\builds\msvc\vs2015\libzmq.sln",选择确定进行工程升级。最后编译项目,但是可能会有6个项目编译不成功的提示。 根据引用,选择ZMQ框架是为了实现联机对战功能,而不直接使用winsock。ZMQ的安装过程可能会有一些困难,但也会学到一些东西。同时,ZMQ的作者Pieter Hintjens因癌症去世,但他留下的作品仍然在影响着世界。 根据引用,一些问题可能会出现在使用VS编译sln文件时,因为早期的sln文件是由cmake生成的,所以在编译过程中可能会出现路径引用不正确的问题。解决方案是打开libzmq.import.props文件,将引用路径中的“...\libzmq”去掉,并将项目名称修改为libzmq。 综上所述,要在VS2017中配置ZMQ,需要下载ZMQ的压缩文件并解压到指定文件夹,然后使用VS2017打开工程文件并进行升级,最后编译项目。可能会遇到一些编译错误,可以根据引用中提供的解决方案进行修复。123 #### 引用[.reference_title] - *1* *3* [VS2017平台编译 zmq-4.2.5 过程](https://blog.csdn.net/vevenlcf/article/details/86580094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ](https://blog.csdn.net/dingguayi7025/article/details/101642914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值