2012-07-07 49 views
0
  1. 首先,我構建了需要通過編譯/usr/local/boost_1_49_0/並運行bootstrap.sh來構建的Boost庫。這沒問題。
  2. 步驟(1)創造了/usr/local/boost_1_49_0/stage/lib
  3. 我測試鏈接到的庫中的所有.so.a文件,說lboost_regex#include <boost/regex>在我的源代碼。這也沒有問題。
  4. 最後嘗試對ASIO的例子,我想:C++鏈接增強庫

    g++ -I/usr/local/boost_1_49_0 MAIN.cpp -o MAIN -L/usr/local/boost_1_49_0/stage/lib -lboost_thread -lboost_system -lpthread 
    

(4)編制好了。但是,當我與./MAIN運行程序時,我得到以下錯誤:

./MAIN: error while loading shared libraries: libboost_system.so.1.49.0: cannot open shared object file: No such file or directory 

回答

3

-L選項只能設置一個編譯時庫搜索路徑;如果你想在運行時找到共享庫,那麼它的目錄必須在運行時被知道。

g++來設置的一種方法是通過編譯器將-rpath傳遞給鏈接器;在你的情況下,你可以說-Wl,-rpath -Wl,/usr/local/boost_1_49_0/stage/lib。 (這將目錄嵌入可執行文件中。)

另一種方法是將庫安裝在鏈接器默認搜索的位置(例如/usr/local/lib可能就是這樣一個地方,具體取決於系統配置方式)。

還有一種方法是設置環境變量,例如LD_LIBRARY_PATH(Linux或Solaris)或DYLD_LIBRARY_PATH鍵(Mac OS X),告訴鏈接到哪裏啓動從其中變量被設置在外殼可執行文件時,搜索。

+0

剛想rpath的警告 - 不要做,如果你打算二進制文件運送到其他人(或其他機器)。跟蹤rpath錯誤可能會非常棘手和痛苦。 – 2012-07-07 05:06:30

+0

但是,通過將$ ORIGIN嵌入到二進制文件的運行時路徑中可以避免該問題。雖然$ ORIGIN路徑仍然是易碎的,但它至少使搜索路徑相對於「二進制位置在哪裏」而不是系統上的特定位置。 – 2012-07-07 05:09:28

+0

@KevinGrant好的,謝謝你把問題整理出來。儘管沒有什麼像麻煩free --static flag – 2012-07-08 04:33:15