本文为您介绍使用 v1.x.x 版本的 C++ SDK 接入消息队列 RocketMQ 版所需完成的准备工作、使用说明以及注意事项,以便后续使用 C++ SDK 收发消息。
使用前,请注意以下几点:
- 本文仅针对 C++ SDK v1.x.x 版本进行说明,若需使用 v2.0.0 版本的 SDK,可选择环境准备(v2.0.0) 或直接下载。v2.0.0 版本的 SDK 使用说明请参见环境准备(v2.0.0)。
- 代码里涉及到的 Topic 和 Group ID,需要到控制台上创建。Message Tag 可以完全由应用自定义,具体创建过程请参见步骤二:创建资源。
- 使用消息队列 RocketMQ 版服务的应用程序需要部署在阿里云 ECS 上。
SDK 下载
C++ SDK 支持 Windows 和 Linux 两个操作系统,而且接口完全一致。Linux 下支持 CentOS 6(RHEL 6)和 CentOS 7(RHEL 7)系列。C++ SDK 的下载链接,请参见版本说明。
下载完成后进行解压,会有如下目录结构,各目录的说明如下:
- demo/(只针对 Windows 系统)
包含了一个创建好的 Windows C++ 演示 Demo。
- example/
包含了普通消息发送、Oneway 消息发送、顺序消息发送、普通消息消费、顺序消息消费等例子,Linux 下还包含了
Makefile
用于example
的编译和管理。 - include/
包含了用户自己编写的程序需要的头文件。
- lib/
- Linux SDK 子目录如下,分别是 64 的静态库和动态库。
lib-boost-share/ libonsclient4cpp.so lib-boost-static/ libonsclient4cpp.a
- Windows SDK 子目录如下,是 64 位系统下 SDK 的 dll 库。如果没有安装 Visual Studio 2015 环境下,需要拷贝安装
vc_redist.x64
。 这是 Visual C++ 2015 的运行时环境。64/ vc_redist.x64
- Linux SDK 子目录如下,分别是 64 的静态库和动态库。
- SDK_GUIDE.pdf
SDK 环境准备文档和 FAQ。
- changelog
新版本发布解决的问题和引入的新特性列表。
Linux C++ SDK
自 2016 年 12 月 2 日开始,Linux CPP 版本依赖了高性能 boost 库(1.62.0 版本),不仅降低了 CPU 资源占用率,而且提高了运行效率。目前主要依赖了
boost_system
、boost_thread
、boost_chrono
、boost_filesystem
四个库,有静态库和动态库两种解决方案。
静态解决方案
消息队列 RocketMQ 版的库文件在 lib/lib-boost-static
目录下,boost 库静态链接到 libonsclient4cpp.a
中。对于没有依赖 boost 库的业务方,可以直接选用静态库方案。静态库方案中,相应的 boost 库已经链接到 libonsclient4cpp.a
,编译时只需要链接 libonsclient4cpp.a
即可,无需执行其他操作。使用方式如下。
cd aliyun-mq-linux-cpp-sdk //下载的 SDK 解压后的路径
cd example //进入 example 目录,修改 example 文件,填入您创建的 Topic 和 Key 等相关的信息
make static=1
yum
或者 > apt-get
来安装相关的静态库。
此外使用如上方式会出现一些警告信息如下。
warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
建议最佳的方式,不要使用完全的静态链接,而是只静态链接 onsclient4cpp,其他库动态链接即可。使用方式如下。
g++ -ggdb -Wall -O3 -I../include ../example/ProducerExampleForEx.cpp -Wl,-static -lonsclient4cpp -L../lib/lib-boost-static/ -Wl,-Bdynamic -lpthread -ldl -lrt -o ../example/ProducerExampleForEx
此外,由于 GCC 5.x 引入 Dual ABI,编译链接时,请添加 -D_GLIBCXX_USE_CXX11_ABI=0 编译选项。
动态解决方案
消息队列 RocketMQ 版的库文件在 lib/lib-boost-share
目录下,需要业务方生成可执行文件时链接 boost 动态库和 libonsclient4cpp.so
。对于业务方已经依赖了 boost 库,需要选择动态库方案的情况,对 boost 库的依赖需要做如下工作:
- 下载 boost 1.62.0 版本。
- 解压 boost 1.62.0。
tar --bzip2 -xf /path/to/boost_1_62_0.tar.bz2
- 安装 boost 1.62.0 版本:
- 进入 boost 1.62.0 解压后的路径:
cd path/to/boost_1_62_0
- 配置 boost:
./bootstrap.sh
- 编译 boost:
./b2 link=shared runtime-link=shared
- 安装 boost:
./b2 install
- 进入 boost 1.62.0 解压后的路径:
- 执行
ldconfig -v|grep libboost
。如果有相关的输出,则表明 boost 动态库在动态库搜索路径中。 - 生成可执行文件时,需要链接 boost 动态库和消息队列 RocketMQ 版的动态库。方法如下。
cd aliyun-mq-linux-cpp-sdk //下载的 SDK 解压后的路径 cd example //进入 example 目录,修改 example 文件,填入自己在消息队列 RocketMQ 版控制台创建的 Topic 和 Key 等相关的信息 g++ -Wall -Wno-deprecated -L ../lib/lib-boost-share/ -I ../include/ ProducerExampleForEx.cpp -lonsclient4cpp -lboost_system -lboost_thread -lboost_chrono -lboost_filesystem -lpthread export LD_LIBRARY_PATH="../lib/lib-boost-share/" //添加动态载入的搜索路径 ./a.out //运行程序
Windows C++ SDK
Visual Studio 2015 环境下使用 C++ SDK
- 使用 Visual Studio 2015 创建自己的项目。
- 右键单击项目,选择属性 > 配置管理器,设置活动解决方案配置为 release,设置活动解决方案平台为 x64。
- 右键单击项目,依次选择属性 > 配置属性 > 常规 > 输出目录:/A。按照活动解决方案平台的设置,拷贝 64 位 lib 目录下的所有文件到输出目录 /A。
- 右键单击项目,依次选择属性 > 配置属性 > C/C++-常规 > 附加包含目录:/B。 拷贝
include
目录下的头文件到包含目录: /B。 - 右键单击项目,依次选择属性 > 配置属性 > 链接 > 常规 > 附加库目录:/A。
- 右键单击项目,依次选择属性 > 配置属性 > 链接 > 输入 > 附加依赖项:ONSClient4CPP.lib。
- 右键单击项目,依次选择属性 > 配置属性 > C/C++-常规 > 预处理器定义: 添加 WIN32 宏。
Visual Studio 非 2015 环境下使用 C++ SDK
- 首先需要按照 Visual Studio 2015 的环境来配置,配置过程同 Visual Studio 2015 环境下使用 C++ SDK。
- 安装 vc_redist.x64。这是 Visual C++ 2015 的运行时环境。
注意 如果不想进行繁琐的设置,您也可以使用设置好的 SDK Demo,下载 SDK 后进行解压,然后进入 demo 目录,使用 Visual Studio 2015 打开工程。
示例如下:
到此为此就设置好编译环境了。单击 Build,即可编译出可执行的程序,然后拷贝 dll 到可执行程序的目录下即可运行,或者拷贝 dll 到系统目录下。
升级 v1.x.x 版本的 SDK 至 v2.0.0
目前最新版的 v2.0.0 SDK 和 v1.x.x SDK 保持 API 向前兼容(即新版本兼容旧版本),由于实现方式不同,ABI 是不兼容的。
请按照以下步骤升级:
- 将新版 SDK 的头文件替换老版本的头文件。
- 将新版本
lib
目录下的动态库全部拷贝到存放原版本动态库的目录下。 - 如果之前使用的是静态链接方案,去掉
-static
参数,修改为默认动态路链接方案。 - 修改编译脚本,增加
-lrocketmq_client_core
参数,链接新版内核动态库。 - 重新编译工程。
- 若升级失败,则可选择回退,将工程恢复至升级前状态,重新编译即可。
在文档使用中是否遇到以下问题
更多建议
匿名提交