前言
《深圳男子圖鑑》搬磚ing,但是還是不要忘了學習啊。
Linux安裝軟件一直是一個難以形容的東西,記得剛進小組的Linux知識技能大賽就是安裝一個軟件(ntfs-3g?)。那麼對於Linux下除了方便的包管理系統rpm yum apt-get 等等等等,可以讓我們輕鬆愉快的安裝軟件之外,還有一種很重要的安裝方式,就是源碼編譯安裝。
對於C/C++這種 一次編寫,反覆調,啊不是,一次編寫,到處編譯運行的代碼,用源碼編譯來安裝幾乎是最完美的方式了(ABI問題等等)。
最近在耗時好久完成一次源碼編譯安裝+鏈接開發之後,又收穫了很多知識,趕緊總結一下。
正文
需要安裝的軟件是ProtoBuffer,因爲開發環境很麻煩,所以直接上傳源碼包安裝。
照例我們需要執行
./configure
make
make install
Ok,那麼問題來了。
我們需要編譯出的可執行程序protoc,還有他的so庫libprotobuf。
但是目前呢,按照這個流程會將protoc放在/usr/bin libprotobuf放在/usr/lib
但是如果我不想讓他這樣子呢(纔不會說是沒權限呢)
我只希望能把這些東西生成在我自己的目錄下。
不得不說google的開源項目還是挺良心的,在INSTALL.txt下有這樣的說明
By default,
make install
will install the package’s files in
/usr/local/bin
,/usr/local/man
, etc. You can specify an
installation prefix other than/usr/local
by giving ‘configure’ the
option--prefix=PATH
.
enmm之前一直覺得configure只是檢測一下系統的配置依賴啥的,才知道還可以控制之後的Makefile,對整個編譯過程都有影響。
同時,我們知道對於這種庫,需要在gcc的參數裏制定鏈接路徑-L
和頭文件路徑-I
.
想起了C鏈接MySQL時用到的MySQL的C客戶端了,當時有個東西叫mysql_config
,安裝MySQL的C客戶端自帶的好像,再需要鏈接MySQL的庫時直接加上`mysql_config - -libs`就行了,不用自己再手動去找路徑了。
而今天發現了有類似功能的東西–pkg-config
像pb在源碼編譯安裝時就會產生一個protobuf.pc的文件。存在於/usr/bin/pkgconfig下,它裏面的內容如下
prefix=/home/kang
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib
includedir=${prefix}/include
Name: Protocol Buffers
Description: Google's Data Interchange Format
Version: 2.6.1
Libs: -L\${libdir} -lprotobuf -pthread -lpthread
Libs.private: -lz
Cflags: -I${includedir} -pthread
# Commented out because it crashes pkg-config *sigh*:
# http://bugs.freedesktop.org/show_bug.cgi?id=13265
# Conflicts: protobuf-lite
so 如果我們想開發需要pb的程序,就不用再手動-L
啥的了,直接編譯時加上`pkg-config --libs(後面也要有那個點,md太蛋疼了,我不知道咋加)
瞄了一眼,似乎源碼編譯安裝的庫都會可以通過pkg-config
來操作呢,真是很方便。
最近還學到一個知識點是gcc的-D參數可以傳遞宏,控制條件編譯,比如設置的很多斷言啊,就可控制略掉了。