2012-08-31 21 views
3

什麼是對,包括在內置程序Boost庫的最佳實踐Boost庫?查找Makefile中

爲了舉例說明,假設我們的項目採用Boost的正則表達式,並編譯如下:

g++ -lboost_regex -o main main.cpp 

...這意味着我可以寫一個Makefile其中只包含以下內容:

LDFLAGS+=-lboost_regex 

$ make main 
ld: library not found for -lboost_regex 
collect2: error: ld returned 1 exit status 

不幸的是,這並不在我的系統上運行

這是可以理解的,因爲我沒有指定庫路徑,並且Boost安裝在編譯器沒有找到它的位置。

我不想硬編碼在我的Makefile這條道路,很明顯。否則,該項目不能在其他機器上構建。

一個解決辦法是設置LD_LIBRARY_PATHthis is discouraged

正常庫中的「真正的」解決方案是使用pkg-config,例如像這樣:

LDFLAGS+=$(shell pkg-config --libs sqlite3) 

......這是解決沿-L/path/to/sqlite/lib -lsqlite3行的東西。

不幸的是,Boost still doesn’t support pkg-config

這讓我陷入兩難境地。似乎沒有確定Boost庫安裝路徑的通用方法。 其他項目如何處理?

(有人建議將環境變量BOOST_ROOT但似乎並沒有被普遍地存在要麼,你需要手動設置它的.bashrc中/ profile文件的一個文件。)

+0

您可以指定多個'-L'和'-Wl,-rpath'選項,連接器將按順序搜索這些選項。 –

+0

@Maxim True,但你需要硬編碼路徑,並猜測它可能是哪些。在某些情況下,這根本行不通。例如,我在路徑'/ nfs/company_name/research/groupname/subfolder/lib'中安裝了Boost - 你應該如何猜測這條路徑? –

+0

@Konrad:使其成爲glob文件夾的全局搜索! :D – Xeo

回答

2

因爲我我建議使用BOOST_ROOT的那個人,我也可以把它作爲答案。

背景:Boost的bjam編譯程序需要一個BOOST_ROOT環境變量,如果它沒有在boosts安裝根目錄下執行的話。
有了這個想法,一個可能藏漢「依靠」就可以了,即需要它的時候make由要麼有它作爲一個完整的環境變量,所有的時間或調用只是像BOOST_ROOT=/foo/bar/boost make會議/命令時設置存在。

+0

構建腳本依賴於環境變量被認爲是不好的做法。 –

+1

@Maxim當然,*如果*有更好的解決方案可用。到目前爲止,情況並非如此。 –

+0

它不一定是一個環境變量。例如,GNU Make可以將可變覆蓋值作爲命令行參數。 – Tanz87