2011-05-04 119 views
4

我有一個項目,鏈接到各種常見的圖書館,以及Boost。在我自己以外的計算機上進行測試已被證明是困難的,因爲各種版本的Linux都帶有不同版本的Boost。我寧願避免在每臺機器上下載和編譯相同版本的Boost。你如何靜態鏈接Boost庫?

有沒有一種方法可以將我的程序靜態鏈接到Boost庫,並且一切正常?我嘗試過將靜態鏈接(靜態),但這會導致其他問題(即找不到lGL)。有沒有其他可能的方式,我只能用我的程序打包必要的動態庫(比如說與可執行文件位於同一個文件夾中)並以這種方式分發它?

鏈接出錯試圖鏈接的一切靜態時:

g++ -static -o"acmserver" ./src/acmserver.o ./src/airplane.o ./src/bullet.o ./src/control.o ./src/detail.o ./src/game.o ./src/gamelog.o ./src/gamelogitem.o ./src/guns.o ./src/map.o ./src/missile.o ./src/missilepod.o ./src/object.o ./src/server.o -lboost_system -lboost_filesystem -lboost_thread -lboost_serialization -lboost_date_time -lpthread -lGLU -lGL 
/usr/bin/ld: cannot find -lGL 
collect2: ld returned 1 exit status 
make: *** [acmserver] Error 1 

EDIT(液):

COUNT0提到的正是我一直在尋找。在Eclipse中,我從Project - > Properties - > C/C++ Build - > Settings - > GCC C++ Linker - > Libraries - > Libraries(-l)中刪除了所有Boost庫(例如boost_system)。然後,我在Project - > Properties - > C/C++ Build - > Settings - > GCC C++ Linker - > Miscellaneous - > Other Objects下添加了Boost .a文件(例如/usr/lib/libboost_system.a)。我還從鏈接器標誌中刪除了「-static」。這產生了一個可執行文件,所有的boost庫都是靜態鏈接的,而不是動態鏈接的。

回答

6

只需使用boost存檔文件(.a文件)而不是共享lib文件(即.so也就是用-l鏈接)。您現在正在動態鏈接這些boost庫。寫出來可能有助於確保什麼是鏈接的靜態和動態什麼

這將是這個樣子:

g++ -static -o"acmserver" ./src/acmserver.o ... ./src/server.o \ 
    /usr/local/lib/libboost_system.a /usr/local/lib/boost_filesystem \ 
    ... -lGL ... 
+0

這就是我一直在尋找的東西!我只是刪除了 -static「並添加了.a文件。 – JuiceboxHero 2011-05-04 21:53:39

+0

這是正確的 - 靜態必須去,我的壞。 – count0 2011-05-05 14:15:56

0

這個錯誤表明你的連接器沒有找到GL庫,這與boost沒有任何關係。

確保您的系統上安裝了libgl1-mesa-dev或等效軟件包。

+0

礦位於:'/ usr/lib中/ libGL.so' – karlphillip 2011-05-04 21:07:00

+0

是的,先生,這是安裝。當動態鏈接時,一切正常。但是當我將那個靜態標誌放在那裏時,它會因上述錯誤而失敗。這就是爲什麼我想靜態鏈接Boost而不用擔心lGL。 – JuiceboxHero 2011-05-04 21:24:13

+0

如果它安裝在系統上,將編譯路徑添加到庫中,它將變成如下所示:'-L/usr/lib -lGL' – karlphillip 2011-05-04 21:26:28