如果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,注意编译出来的文件在oost_1_58_0stagelib下面,不出意外的话这里应该是大部分都编译成功了(为什么要说大部分,因为这里还有一个小坑)
接下来是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,文件倒是有的,在srcinclude下,照葫芦画瓢,加到包含目录中即可,
顺带说一句,在已有的包含目录中有$(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 hirdpartyzlib-1.2.3-srcsrczlib1.2.3zlib-1.2.3
最后就是一大堆因为没有把文件加入VS项目导致的链接错误,建议把以下文件夹的文件都加进项目再编译:common、consumer、extern、include、message、producer、transport
花了一上午时间从头把rocketmq-client-cpp编了一遍,完成了这篇指南,用最后编译成功的提示来做结尾吧。。。
1> 正在创建库 F: est
ocketmq-client-cpp-2.0.1Win32x64Release
ocketmq-client-cpp.lib 和对象 F: est
ocketmq-client-cpp-2.0.1Win32x64Release
ocketmq-client-cpp.exp
1>正在生成代码
1>已完成代码的生成
1>rocketmq-client-cpp.vcxproj -> F: est
ocketmq-client-cpp-2.0.1Win32x64Release
ocketmq-client-cpp.dll
1>已完成生成项目“rocketmq-client-cpp.vcxproj”的操作。
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
顺便说一句,我还把rocketmq-client-cpp-2.0.1静态链接编译了一次,Release版本大了300多k,至少不用担心缺文件的情况了。