• rocketmq-client-cpp(2.0.1)编译指南


    如果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,至少不用担心缺文件的情况了。

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

  • 相关阅读:
    MYSQL中数据类型介绍
    怎么评估软件上线标准
    文件安全复制之 FastCopy
    强烈推荐美文之《从此刻起,我要》
    浅谈软件测试与墨菲定律
    夜神模拟器--安卓模拟神器
    RoadMap:如何创建产品路线图
    利用Python爬虫刷店铺微博等访问量最简单有效教程
    MySQL 数据库中删除重复数据的方法
    如何测试一个杯子
  • 原文地址:https://www.cnblogs.com/s5689412/p/12496233.html
Copyright © 2020-2023  润新知