2010-02-24 82 views
10

我在Linux,GCC中使用Boost庫。在安裝和構建Boost之後,我發現使用Regex和Thread的程序使用共享的Boost庫。爲了我的目的,我需要靜態鏈接。 如何更改鏈接類型?我應該重建Boost,還是我可以通過在我自己的項目或Boost配置文件中定義一些常量來設置鏈接類型?加速靜態鏈接

回答

17

只需將-static添加到您的構建調用中即可。下面是一個簡單的例子會話:

$ cat boost_formatted_time.cpp 
#include <iostream> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/posix_time/posix_time_io.hpp> 

using namespace boost::posix_time; 
using namespace std; 

int main(int argc, char **argv) { 
    time_facet *facet = new time_facet("%d-%b-%Y %H:%M:%S"); 
    cout.imbue(locale(cout.getloc(), facet)); 
    cout << second_clock::local_time() << endl; 
} 
$ g++ -o /tmp/bft_dyn boost_formatted_time.cpp -lboost_date_time 
$ g++ -static -o /tmp/bft_stc boost_formatted_time.cpp -lboost_date_time 
$ ls -lh /tmp/bft_* 
-rwxr-xr-x 1 edd edd 216K 2010-02-24 12:34 /tmp/bft_dyn  
-rwxr-xr-x 1 edd edd 1.5M 2010-02-24 12:34 /tmp/bft_stc  
$ /tmp/bft_dyn 
24-Feb-2010 12:34:55 
$ /tmp/bft_stc 
24-Feb-2010 12:34:59 
$ 

注意靜態二進制是如何1.5MB,而不是216KB的動態鏈接的變體。 所有使用默認Boost軟件包進行的Debian測試都已完成。

+1

我不從命令行運行gcc,我正在使用Eclipse CDT。可能的靜態開關可以從項目設置傳遞給鏈接器,我會試着找到這種方式。謝謝。 – 2010-02-24 18:45:45

+0

當包含多個庫時,「-static」是否對所有庫都有影響? – mrgloom 2016-05-27 17:34:29

0

向鏈接器指定-Lpath/to/library/

+0

我對項目構建和庫路徑沒有任何問題,我只需要更改鏈接類型:從動態到靜態。 – 2010-02-24 18:39:42

+6

這是不正確的 - 你需要'-static'。 '-L'給出庫的位置,但不是鏈接類型。看到我的答案全部會議。 – 2010-02-24 18:40:19