惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
博客园 - Franky
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
GbyAI
GbyAI
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
博客园 - 叶小钗
罗磊的独立博客
The GitHub Blog
The GitHub Blog
H
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
Martin Fowler
Martin Fowler
Spread Privacy
Spread Privacy
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
N
Netflix TechBlog - Medium
T
The Exploit Database - CXSecurity.com
云风的 BLOG
云风的 BLOG
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
Cyberwarzone
Cyberwarzone
T
Threatpost
T
Threat Research - Cisco Blogs
Recent Announcements
Recent Announcements
T
Tor Project blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Last Week in AI
Last Week in AI
L
Lohrmann on Cybersecurity
量子位
V
V2EX
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Proofpoint News Feed
I
Intezer
Schneier on Security
Schneier on Security
雷峰网
雷峰网
B
Blog RSS Feed
Jina AI
Jina AI
爱范儿
爱范儿
Attack and Defense Labs
Attack and Defense Labs
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Palo Alto Networks Blog
美团技术团队
博客园 - 【当耐特】

博客园 - sPhinX

如何解决在Win11下卸载McgsPro失败的问题 如何离线安装WinDbg Preview 敏捷软件开发 原则、模式与实践 第9章的例子程序(C#版) Akavache简明使用指南 Oracle存储过程解析XML内容 P/Invoke继续谈 有意思的案例: 的问题 dnSpy - 让调试镜像文件的工作变得轻松点 dnSpy调试IIS(w3wp进程) Xilium.CefGlue与SingleProcess RocketMQ .NET客户端的那些坑 P/Invoke今日谈 .NET编译问题汇总 动态的世界 使用ProcDump自动生成Dump文件 Process.Start可能无法选中指定文件的问题 获取本地IP 将exe和dll打包为一个exe文件 .NET异步资料收集
rocketmq-client-cpp(2.0.1)编译指南
sPhinX · 2020-03-15 · via 博客园 - sPhinX

如果rocketmq-client-cpp真的像声称的那样,“一个命令即可编译整个项目”,那也就没这篇文章了。

现在下载到的rocketmq-client-cpp最新版本是2.0.1,下载的压缩包不大,只有500多k,不过编译后占了10.8G(编译了x64的Release版本和Debug版本),请要编译的同学准备好硬盘空间哈。

我的编译环境是Windows 10.0.18362.720,Visual Studio 2017 15.9.21(安装了VC++ 2015.3 v14.00工具集)

废话不多说,下面开始。

先解压文件,之后打开VS2017的x64本机工具命令行,切换到解压文件夹,直接执行 win32_build.bat ,这下会自动下载需要的第三方库,然后编译为64位的dll,这应该就是一个命令编译整个项目的由来了。

注意:下载代码需要用到git,请先安装。

理所当然的编译失败了,下面来一个一个项目的检查

首先是boost_1_58_0,注意编译出来的文件在\boost_1_58_0\stage\lib下面,不出意外的话这里应该是大部分都编译成功了(为什么要说大部分,因为这里还有一个小坑)

接下来是jsoncpp-0.10.6和libevent-release-2.0.22,这两个项目编译出的文件都在相应的x64目录下,如果x64目录下没有找到对应的lib文件,说明编译失败了

先来看jsoncpp-0.10.6,没找到lib文件,说明失败了。我们用VS2017打开jsoncpp_lib_static.vcxproj,可能会有下图的提示,

说明你计算机上的Windows SDK和平台工具集与项目的原始设置不一致,我们把工具集升级到141(VS2017对应的版本),SDK不升级

打开项目之后,默认是编译x86的Debug版本,改成x64的Release版本,编译会提示无法打开头文件的错误,这里很简单,只需要参考x86的Debug版本的设置,修改包含目录的设置,把路径包含进来就可以了。

接下来是libevent-release-2.0.22,同样也是提示找不到头文件,但是这里的和上面稍有不同,修改的位置在这里

然后还要增加WIN32的预处理定义

两个第三方库编译好了,下面该是最重头的rocketmq-client-cpp-2.0.1了。同样是用VS2017打开,先试着编一下x64的Release版本。

嗯,1438个错误,别急,慢慢来,加一个WIN32_LEAN_AND_MEAN预定义再编译看看

接下来是缺少文件的提示,先是MQClient.cpp,搜索之后没有这个文件,但是有一个名字相似的DefaultMQClient.cpp,正好我下载的1.2.0版本里面有MQClient.cpp,比较一下基本确定这两个文件是一回事,

应该是版本升级修改了文件名,但不是在VS下修改的,所以导致解决方案找不到这个文件了,所以移除即可。

然后是头文件MQConsumer.h,文件倒是有的,在\src\include下,照葫芦画瓢,加到包含目录中即可,

顺带说一句,在已有的包含目录中有$(SolutionDir)..\include这一项,估计是升级的时候把include目录移动到了src下,但是没有修改VS设置所致。

接下来是类定义错误:使用了未定义类型“boost::weak_ptr<rocketmq::PullRequest>” 

如果说前面的错误都可能是因为项目没有在VS下同步导致,那这个问题就有点想不通了,难道在其他平台下编译不包括头文件也可以通过吗?

加上头文件即可:#include <boost/smart_ptr/weak_ptr.hpp>

下面再改改函数声明:

static void hexdump(unsigned char* buffer, char* out_buff, std::size_t index);

setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val));

好了,遇到上面说的坑了,明明boost已经编译完了,但是链接的时候还会提示:无法打开文件“libboost_zlib-vc140-mt-1_58.lib”,看了一下确实没这个文件,上网搜了一圈,原来boost现在默认不编译zlib,需要自己去下载,然后设置编译参数

于是参考win32_build.bat里面的编译命令加上实际的zlib路径,自己手工编了一次

b2 address-model=64 --with-serialization --with-atomic --with-log --with-locale --with-iostreams --with-system --with-regex --with-thread --with-date_time --with-chrono --with-filesystem -sZLIB_INCLUDE="自己的zlib路径" -sZLIB_SOURCE="自己的zlib路径" link=static  threading=multi variant=release runtime-link=shared --build-type=complete

注意:如果你是用之前下载的zlib代码编译的话,路径是rocketmq-client-cpp-2.0.1\thirdparty\zlib-1.2.3-src\src\zlib\1.2.3\zlib-1.2.3

最后就是一大堆因为没有把文件加入VS项目导致的链接错误,建议把以下文件夹的文件都加进项目再编译:common、consumer、extern、include、message、producer、transport

花了一上午时间从头把rocketmq-client-cpp编了一遍,完成了这篇指南,用最后编译成功的提示来做结尾吧。。。

1> 正在创建库 F:\test\rocketmq-client-cpp-2.0.1\Win32\x64\Release\rocketmq-client-cpp.lib 和对象 F:\test\rocketmq-client-cpp-2.0.1\Win32\x64\Release\rocketmq-client-cpp.exp
1>正在生成代码
1>已完成代码的生成
1>rocketmq-client-cpp.vcxproj -> F:\test\rocketmq-client-cpp-2.0.1\Win32\x64\Release\rocketmq-client-cpp.dll
1>已完成生成项目“rocketmq-client-cpp.vcxproj”的操作。
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

顺便说一句,我还把rocketmq-client-cpp-2.0.1静态链接编译了一次,Release版本大了300多k,至少不用担心缺文件的情况了。

rocketmq-client-cpp-2.0.1-x64-release-shared-link.rar