zmq(C++)编译

一、安装libsodium(非必安装项)

1、下载源码

进入官网:https://github.com/jedisct1/libsodium,解压到指定目录。

2、Linux平台

(1)编译前准备

  • 需要先安装libtoolautoconf
sudo apt install libtool
sudo apt install autoconf

(2)编译安装

进入libsodium解压后的目录,执行以下命令:

./autogen.sh
./configure --prefix=/opt/libsodium-1.0.18
make check
sudo make install

(3)配置环境

  • 如果前面执行configure时没有配置--prefix选项,则其会安装在/usr/local,则需要调用命令:
sudo ldconfig
  • 如果有配置--prefix选项,则需要设置环境变量,编辑/etc/profile文件,在末尾添加:
export LIBSODIUM_ROOT=/opt/libsodium-1.0.18-ubuntu-x64
# 运行依赖
export LD_LIBRARY_PATH=$LIBSODIUM_ROOT/lib:$LD_LIBRARY_PATH
# 开发依赖
export CPATH=$LIBSODIUM_ROOT/include:$CPATH
export LIBRARY_PATH=$LIBSODIUM_ROOT/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=$LIBSODIUM_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH # 需要同步修改pkgconfig目录下libsodium.pc文件中的prefix路径,指定为当前的库路径

执行source /etc/profile,然后重启(否则只在当前终端中有效,新开终端需要再次执行命令才生效)。

3、Window平台

解压后,进入目录并执行构建命令:

cd libsodium\builds\msvc\build
buildall.bat
cd ../../../bin/

结束后将生成Win32x64平台的DebugRelease库文件。然后可以把相关的库和头文件拷贝到一起,例如:

  • 创建目录libsodium-1.0.18-windows-x64-msvc
  • libsodium/src/libsodium/include目拷贝进去(可以删除无用的include/Makefile.aminclude/sodium/version.h.in文件以及inclue/sodium/private目录)。
  • 创建子目录lib,然后把生成的动态库或静态库文件拷贝进去。

二、安装ZeroMQ

1、下载源码

进入官网:https://github.com/zeromq/libzmq,解压到指定目录。

2、Linux平台

(1)编译安装

进入libzmq解压后的目录,执行以下命令:

./autogen.sh
./configure --prefix=/opt/zeromq-4.3.4
make
sudo make install

说明: 某些情况下可能需要使用libsodium加密库替换默认内置的tweetnacl加密库,则需要加上选项--with-libsodium,大部分情况下不需要该选项。

(2)配置环境

  • 如果前面执行configure时没有配置--prefix选项,则其会安装在/usr/local,则需要调用命令:
sudo ldconfig
  • 如果有配置--prefix选项,则需要设置环境变量,编辑/etc/profile文件,在末尾添加:
export ZEROMQ_ROOT=/opt/zeromq-4.3.4-ubuntu-x64
# 运行依赖
export LD_LIBRARY_PATH=$ZEROMQ_ROOT/lib:$LD_LIBRARY_PATH
# 开发依赖
export PATH=$ZEROMQ_ROOT/bin:$PATH
export CPATH=$ZEROMQ_ROOT/include:$CPATH
export LIBRARY_PATH=$ZEROMQ_ROOT/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=$ZEROMQ_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH # 需要同步修改pkgconfig目录下libzmq.pc文件中的prefix路径,指定为当前的库路径

执行source /etc/profile,然后重启(否则只在当前终端中有效,新开终端需要再次执行命令才生效)。

3、Windows平台

解压后,打开CMake工具,配置相关项,例如:

  • 选择构建动态库还是静态库
    在这里插入图片描述
  • 选择是否使用libsodium加密库替换默认内置的tweetnacl加密库,大部分情况下不需要勾选。
    dnimg.cn/dd7857f378ad4cb5bdd67eaffc0cd7af.png)

然后打开工程即可编译构建。构建结束后,右键INSTALL项目,点击生成即可生成依赖库,如:
在这里插入图片描述

三、安装ZMQPP

1、下载源码

进入官网:https://github.com/zeromq/zmqpp,解压到指定目录。

2、Linux平台

(1)编译前准备

进入ZMQPP解压后的目录,可以手动修改Makefile文件,视情况需要修改的有:

  • 修改ZMQPP库的安装路径(默认安装在/usr/local),例如:PREFIX = /opt/zmqpp-4.2.0
  • 如果编译安装ZeroMQ库时通过选项--prefix指定了非默认安装位置,则在ZMQPP库链接时需要通过-L库路径标识指定ZeroMQ库的路径。例如:COMMON_LIBS = -L/opt/zeromq-4.3.4/lib -lzmq

(2)编译安装

执行以下命令:

make
make check
sudo make install
make installcheck

(3)配置环境

  • 如果修改了库的安装路径,则需要设置环境变量,编辑/etc/profile文件,在末尾添加:
export ZMQPP_ROOT=/opt/zmqpp-4.2.0-ubuntu-x64
# 运行依赖
export LD_LIBRARY_PATH=$ZMQPP_ROOT/lib:$LD_LIBRARY_PATH
# 开发依赖
export CPATH=$ZMQPP_ROOT/include:$CPATH
export LIBRARY_PATH=$ZMQPP_ROOT/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=$ZMQPP_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH # 需要同步修改pkgconfig目录下libzmqpp.pc文件中的prefix路径,指定为当前的库路径

执行source /etc/profile,然后重启(否则只在当前终端中有效,新开终端需要再次执行命令才生效)。

3、Windows平台

解压后,打开CMake工具,配置相关项,首次会出现红色框内的错误,提示找不到zeromq
在这里插入图片描述

这里配置本机的zeromq库路径,例如:
在这里插入图片描述

然后打开工程即可编译构建。然后过程中会出现如下错误:
在这里插入图片描述

上图红框内为失败原因,双击红框中任意一行,打开源码 compatibility.hpp,其中第132行有错,原因是SOCKET没有定义,需要包含 winsock2.h头文件。在第37行插入头文件#include <WinSock2.h>
在这里插入图片描述

继续编译后再次报如下错误:
在这里插入图片描述

上图红框内为失败原因,双击红框中任意一行,打开源码socket.cpp中第344行,显示std::min有问题。查资料得,因为Windows.h包含的windef.h中有宏定义minmax,导致此处min被展开宏。
在这里插入图片描述

查到一个简单的方法,使用项目范围的/D "NOMINMAX"选项就可以避免这个干扰。右击打开zmqppzmqpp-static项目属性,在配置属性>C/C++>命令行页面中的其它选项内,加上/D "NOMINMAX",如:
在这里插入图片描述

构建结束后,右键INSTALL项目,点击生成即可生成依赖库。

03-12
### C++ 中使用 ZeroMQ 的教程与示例 #### 1. 配置环境 为了在项目中使用 ZeroMQ,需先安装该库。有两种主要方法获取并设置 ZeroMQ 库:一种是从官方发布的版本直接下载编译好的二进制文件;另一种则是自行克隆源码仓库后利用 Visual Studio 或其他工具链完成本地构建[^3]。 #### 2. 基础概念理解 ZeroMQ 是一款轻量级的消息传递框架,能够处理多种类型的异步消息传输模式,比如请求-响应 (Request/Reply),发布-订阅 (Pub/Sub) 及推送-拉取 (Push/Pull)[^4]。这些不同的通信范式允许开发者灵活设计分布式系统的交互逻辑。 #### 3. 编写简单的发送者程序 下面展示了一个基本的例子,演示如何创建一个简单的消息发送方: ```cpp #include <zmq.hpp> #include <string> #include <iostream> int main() { // 初始化ZMQ上下文对象 zmq::context_t context(1); // 创建PUSH类型套接字实例并与指定端点建立连接 zmq::socket_t socket(context, zmq::socket_type::push); socket.connect("ipc:///tmp/zmq_ipc_example"); // 构造要发送的信息字符串 std::string message = "Hello from sender!"; // 将信息转换成适合于ZMQ的消息格式,并执行实际的数据发送操作 zmq::message_t msg(message.size()); memcpy(msg.data(), message.c_str(), message.size()); socket.send(msg, zmq::send_flags::none); return 0; } ``` 此代码片段展示了怎样初始化 ZMQ 上下文、定义套接口及其绑定地址,以及最终向目标位置发送一条文本消息的过程[^2]。 #### 4. 利用现代 C++ 特性简化开发流程 当采用 C++ 实现基于 ZeroMQ 的应用时,可以充分利用语言本身提供的现代化功能来增强编码效率和可读性。例如,在上述例子中可以看到 `#include <iostream>` 被用来替代传统的 `<stdio.h>` 头文件引入标准输入输出流的支持;而像 `std::thread` 这样的组件则可用于更方便地管理和控制多线程任务,甚至可以通过容器类如 `std::vector<std::thread>` 动态维护一组工作线程池[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值