windows下qpid-cpp 1.38.0編譯實錄
一、編譯環境
1、vs2017社群版15.5.3 ,.NET Framework 4.7.03056
2、從www.boost.org上下載boost 1.68.0原始碼
3、從qpid.apache.org下載qpid proton 0.26.0 ,qpid c++ broker 1.38.0
4、從www.cmake.org上下載windows版的壓縮包,直接解壓就可以了。我下載的是3.13.0-rc1 win64版本
5、從http://www.slproweb.com/products/Win32OpenSSL.html上下載OpenSSL,我下載的是32位版本,然後安裝。安裝在自己的目錄,不要安裝在系統目錄
6、從www.python.org上下載 2.7.15版本,32位的安裝程式。
7、從http://www.doxygen.nl/ 上下載doxygen的windows的32位版本
8、從http://www.ruby-lang.org上下載ruby的32位windows的安裝程式,注意是x86不是x64。我建議直接下載7z的打包不是exe。
9、從www.swig.org上下載swigwin-3.0.12,無需安裝,直接解壓到本地。再將路徑加入到PATH環境變數。
二、環境確認
1、開啟cmd命令視窗
2、執行 python -V,如果正確輸出"Python 2.7.15",則結束。如果沒有,請將python的安裝路徑加入環境變數PATH。再重啟cmd,後重新執行以上命令。注意:V是大寫。
3、執行ruby -v ,如果正確輸出 ruby 2.5.3xxxx,則結束。確認有【i386-mingw32】字樣,保證是32位版本的。
4、執行swig -version,注意是一個橫槓。如果輸出"SWIG Version 3.0.12"結束。否則,請將執行路徑加入PATH環境變數。
5、執行doxygen -v,如果正確輸出 1.18.4,則結束。
三、編譯proton
1、寫在所有之前:在正式編譯之前,請先進入${RUBY_ROOT}\lib目錄,將原來libmsvcrt-ruby250.dll.a拷貝複製一份,修改新檔案的檔名為mscrt-ruby253.lib。這樣可以騙過cmake的指令碼。
2、開啟cmake-gui,輸入source path和build path。再點選configure按鈕。
3、如下圖,見高亮部分,這個目錄事關編譯qpid-cpp成功的關鍵。
目錄E:/qpid/qpid-cp-1.38.0是我放qpid原始碼的,qpid-proton是我準備安裝proton的地方,請記住,這個名字最好不要改,否則後面有麻煩。
4、點選按鈕"Configure",等到cmake底部輸出Configuring done之後,再點選"Generate"。等到輸出"Generating done"之後,工程就生成完畢。
5、用vs2017開啟E:/qpid/qpid-proton-0.26.0/build目錄下的Proton.sln,編譯ALL_BUILD專案,完成之後再編譯INSTALL專案。INSTALL專案實際上輸出proton結果到CMAKE_INSTALL_PREFIX目錄。
6、檢查CMAKE_INSTALL_PREFIX是否有東西。有則說明編譯成功
四、編譯boost專案
1、解壓boost 1.68.0的原始碼到E:/boost_1_68_0,這是我的解壓路徑,後面都是按這個路徑來。
2、進入目錄E:/boost_1_68_0,執行bootstrap.bat,生成b2.
3、執行b2 --link=shared,請注意加入--link=shared,因為qpid-cpp的預設引入的是動態庫,而不是靜態庫。
4、注意點:這裡不使用boost 1.58.0,因為我的機器上同時裝有vs2008,還有vs2017,死活都使用vs2008。
五、編譯qpid-cpp專案
1、再次開啟cmake-gui,輸入source path 和build path。我的原始碼路徑在E:/qpid/qpid-cpp-1.38.0,build路徑也在該目錄下。點選"Configure"按鈕,暫時通不過。
2、敲黑板,畫重點了。進入上面Proton的安裝路徑E:\qpid\qpid-cpp-1.38.0\qpid-proton,將該目錄下的lib\cmake\Proton中ProtonConfig.cmake和ProtonConfigVersion.cmake拷貝到E:\qpid\qpid-cpp-1.38.0\qpid-proton中。
3、見下圖,不需要的配置就取消。一定要記住,將下圖中高亮部分也取消了。
4、再次點選"Configure"按鈕,等配置完成後,再點選"Generate"按鈕,就可以生成目標工程檔案。
5、使用vs2017開啟E:\qpid\qpid-cpp-1.38.0\build目錄下的qpid-cpp.sln解決方案。
6、敲黑板,畫重點了。開啟qpidcomm工程,找到原始碼Logger.cpp,定位到第48行。
原來有一行程式碼:sys::PODMutex loggerLock = QPID_MUTEX_INITIALIZER;
改成sys::PODMutex loggerLock ; //= QPID_MUTEX_INITIALIZER;
這個靜態賦值在boost_1_68_0中不合法。
7、參照之前的步驟,點選Configure和Generate按鈕。然後使用vs2017開啟qpid-cpp.sln,編譯ALL_BUILD專案。
8、到build\src\Debug目錄下檢查是否有一堆dll和lib檔案。
六、編後語
開源專案的編譯是個很繁瑣的事情,即使如qpid這個專案,是apache的頂級專案,也是如此。究其原因,我猜測是windows系統的天然鄙視。話說回來,我還是傾向於在windows下寫程式碼和除錯,在linux下執行,便利和效能兼得。如果有什麼問題,可以聯絡我。費了很大的勁才搞定。