Proxygen編譯安裝和開發環境的搭建

Proxygen是facebook開源的高性能的http框架,它和thriftrpc一起,構成一套http和rpc的訪問的姊妹框架。由於項目的選用了thrift作爲rpc框架,所以採用proxygen作爲對外提供http服務的框架。
首先,下載proxygen源碼,地址:
https://github.com/facebook/proxygen
運行deps.h腳本,該腳本首先安裝proxygen的所有依賴包,然後生成編譯配置,最後編譯

./deps.sh

最後在編譯過程中出現問題: 這裏寫圖片描述

/usr/include/glog/logging.h:672: undefined reference to
`google::base::CheckOpMessageBuilder::NewString()

編譯glog時報錯。該問題還是由於本機編譯器時gcc-4.9,安裝的glog包採用gcc-5.0以上版本的編譯器編譯導致的,解決的辦法就是重新下載glog源碼,採用gcc-4.9的編譯器重新編譯安裝。
https://derickrethans.nl/hhvm-gcc-52.html
這理由詳細的編譯步驟,請參考。

重編glog之後,請記住確認新編譯版本的安裝路徑以及/usr/include和/usr/lib目錄下是否有之前安裝的過的glog的相關庫和頭文件,如果有請刪除,否則依然會報錯,因爲系統編譯時會優先查找這些路徑,(關於編譯鏈接和運行時的搜索路徑的方式以及通過ldconfig配置搜索路徑的方法,請自行百度)

重新運行deps.sh,在folly 檢查依賴庫時報錯,glog庫不可用,查看 folly/folly/config.log日誌,其中由如下報錯:

undefined reference to `gflags::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)

這個函數時glog依賴的gflags中的函數,去gflags頭文件的安裝目錄/usr/include/gflags下查看gflags.h文件,函數的定義時這樣的:

template <typename FlagType>
  FlagRegisterer(const char* name,
                 const char* help, const char* filename,
                 FlagType* current_storage, FlagType* defvalue_storage);

很顯然glog中的引用多了一個參數,應該是glog和gflags的版本不匹配導致的。所以gflags也要下載和glog對應的版本重新編譯安裝。我是直接在git拉最新的glog和gflags版本重新編譯的,參考:

http://www.cnblogs.com/burningTheStar/p/6986048.html

這裏有一個問題,folly在glog鏈接gflags時採用的是動態庫連接,但是gflags在cmake編譯時默認是靜態庫安裝,所以安裝之後folly檢查依賴時依然會報找不到gflags的錯誤。gflags編譯成動態庫需要使用ccmake配置:

1,ccmake ..
(高版本的cmake沒有ccmake工具,我本身是cmake-3.6.1,重新安裝了cmake-3.5.1之後纔可使用ccmake)

這裏寫圖片描述

執行ccmake之後會有這樣一個配置界面,把動態庫選項設爲on
2,cmake .. && make install
最後記得刪除之前安裝的gflags版本

解決以上問題之後,終於可以正常編譯,但最後依然有編譯錯誤 。。。。
這裏寫圖片描述

virtual memory exhausted: Cannot allocate memory

系統虛擬內存不足,分配空間失敗了。。。
(計算機的物理內存時有限的,爲了有效利用資源,操作系統通過虛擬內存的方式,跟物理內存建立映射,通過數據換入換出的方式以有效提高物理內存的利用率,節約內存資源。關於操作系統內存管理,可以看看程序員自我修養和深入理解計算機操作系統,有詳細的講解)
用free -k 查看我的磁盤
這裏寫圖片描述
我的虛擬機沒有swap分區,我沒有創建swap分區,而是採用創建一個swap文件,以增加虛擬內存的置換空間,參考這篇:
http://blog.csdn.net/finewind/article/details/50824410

最後再次執行deps.sh,終於大功告成^^
編譯結果

這裏寫圖片描述
安裝路徑:
這裏寫圖片描述
這裏寫圖片描述

我們來按git上給出的方法測試一下proxygen源碼裏面echoserver示例:
編譯:

g++ -std=c++14 -o my_echo EchoServer.cpp EchoHandler.cpp
-lproxygenhttpserver -lfolly -lglog -lgflags -pthread

運行:

這裏寫圖片描述

新開一個終端,訪問echoserver:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章