一、編譯環(huán)境
1、vs2017社區(qū)版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位版本,然后安裝。安裝在自己的目錄,不要安裝在系統(tǒng)目錄
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,無(wú)需安裝,直接解壓到本地。再將路徑加入到PATH環(huán)境變量。
二、環(huán)境確認(rèn)
1、打開(kāi)cmd命令窗口
2、執(zhí)行 python -V,如果正確輸出"Python 2.7.15",則結(jié)束。如果沒(méi)有,請(qǐng)將python的安裝路徑加入環(huán)境變量PATH。再重啟cmd,后重新執(zhí)行以上命令。注意:V是大寫(xiě)。
3、執(zhí)行ruby -v ,如果正確輸出 ruby 2.5.3xxxx,則結(jié)束。確認(rèn)有【i386-mingw32】字樣,保證是32位版本的。
4、執(zhí)行swig -version,注意是一個(gè)橫杠。如果輸出"SWIG Version 3.0.12"結(jié)束。否則,請(qǐng)將執(zhí)行路徑加入PATH環(huán)境變量。
5、執(zhí)行doxygen -v,如果正確輸出 1.18.4,則結(jié)束。
三、編譯proton
1、寫(xiě)在所有之前:在正式編譯之前,請(qǐng)先進(jìn)入${RUBY_ROOT}\lib目錄,將原來(lái)libmsvcrt-ruby250.dll.a拷貝復(fù)制一份,修改新文件的文件名為mscrt-ruby253.lib。這樣可以騙過(guò)cmake的腳本。
2、打開(kāi)cmake-gui,輸入source path和build path。再點(diǎn)擊configure按鈕。
3、如下圖,見(jiàn)高亮部分,這個(gè)目錄事關(guān)編譯qpid-cpp成功的關(guān)鍵。

目錄E:/qpid/qpid-cp-1.38.0是我放qpid源碼的,qpid-proton是我準(zhǔn)備安裝proton的地方,請(qǐng)記住,這個(gè)名字最好不要改,否則后面有麻煩。
4、點(diǎn)擊按鈕"Configure",等到cmake底部輸出Configuring done之后,再點(diǎn)擊"Generate"。等到輸出"Generating done"之后,工程就生成完畢。
5、用vs2017打開(kāi)E:/qpid/qpid-proton-0.26.0/build目錄下的Proton.sln,編譯ALL_BUILD項(xiàng)目,完成之后再編譯INSTALL項(xiàng)目。INSTALL項(xiàng)目實(shí)際上輸出proton結(jié)果到CMAKE_INSTALL_PREFIX目錄。
6、檢查CMAKE_INSTALL_PREFIX是否有東西。有則說(shuō)明編譯成功
四、編譯boost項(xiàng)目
1、解壓boost 1.68.0的源碼到E:/boost_1_68_0,這是我的解壓路徑,后面都是按這個(gè)路徑來(lái)。
2、進(jìn)入目錄E:/boost_1_68_0,執(zhí)行bootstrap.bat,生成b2.
3、執(zhí)行b2 --link=shared,請(qǐng)注意加入--link=shared,因?yàn)閝pid-cpp的默認(rèn)引入的是動(dòng)態(tài)庫(kù),而不是靜態(tài)庫(kù)。
4、注意點(diǎn):這里不使用boost 1.58.0,因?yàn)槲业臋C(jī)器上同時(shí)裝有vs2008,還有vs2017,死活都使用vs2008。
五、編譯qpid-cpp項(xiàng)目
1、再次打開(kāi)cmake-gui,輸入source path 和build path。我的源碼路徑在E:/qpid/qpid-cpp-1.38.0,build路徑也在該目錄下。點(diǎn)擊"Configure"按鈕,暫時(shí)通不過(guò)。
2、敲黑板,畫(huà)重點(diǎn)了。進(jìn)入上面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、見(jiàn)下圖,不需要的配置就取消。一定要記住,將下圖中高亮部分也取消了。

4、再次點(diǎn)擊"Configure"按鈕,等配置完成后,再點(diǎn)擊"Generate"按鈕,就可以生成目標(biāo)工程文件。
5、使用vs2017打開(kāi)E:\qpid\qpid-cpp-1.38.0\build目錄下的qpid-cpp.sln解決方案。
6、敲黑板,畫(huà)重點(diǎn)了。打開(kāi)qpidcomm工程,找到源碼Logger.cpp,定位到第48行。
原來(lái)有一行代碼:sys::PODMutex loggerLock = QPID_MUTEX_INITIALIZER;
改成sys::PODMutex loggerLock ; //= QPID_MUTEX_INITIALIZER;
這個(gè)靜態(tài)賦值在boost_1_68_0中不合法。
7、參照之前的步驟,點(diǎn)擊Configure和Generate按鈕。然后使用vs2017打開(kāi)qpid-cpp.sln,編譯ALL_BUILD項(xiàng)目。
8、到build\src\Debug目錄下檢查是否有一堆dll和lib文件。
六、編后語(yǔ)
開(kāi)源項(xiàng)目的編譯是個(gè)很繁瑣的事情,即使如qpid這個(gè)項(xiàng)目,是apache的頂級(jí)項(xiàng)目,也是如此。究其原因,我猜測(cè)是windows系統(tǒng)的天然鄙視。話說(shuō)回來(lái),我還是傾向于在windows下寫(xiě)代碼和調(diào)試,在linux下運(yùn)行,便利和性能兼得。如果有什么問(wèn)題,可以聯(lián)系我。費(fèi)了很大的勁才搞定。