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,注意編譯出來的文件在\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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM