最近跟同學討論c++在編譯時g++ -L.. 和LD_LIBRARY_PATH的問題,今天在做一個東西的時候發現,我對這兩個東西的理解是錯誤的,經過一番研究,寫下我對這些東西的想法,如果有不對的地方,歡迎指正。
我遇到的問題:
g++ multiple.cpp -L/usr/local/lib -lboost_PRogram_options編譯完后,ldd ./a.out發現
libboost_program_options.so.1.55.0 => not found
但是,當我在.bashrc里面寫入:
export LD_LIBRARY_PATH=/usr/local/lib,然后再編譯,我發現可以了,
這是為什么呢?
LD_LIBRARY_PATH是一個環境變量,它的作用是讓動態鏈接庫加載器(ld.so)在運行時(run-time)有一個額外的選項,即增加一個搜索路徑列表。注意,LD_LIBRARY_PATH是在運行時,才起作用。這個環境變量中,可以存儲多個路徑,用冒號分隔。它的厲害之處在于,搜索LD_LIBRARY_PATH所列路徑的順序,先于嵌入到二進制文件中的運行時搜索路徑,也先于系統默認加載路徑(如/usr/lib)[摘自:http://www.ituring.com.cn/article/22101]
g++ -L:是在編譯的時候,去-L指定的地方找庫,-l庫的名字
上面問題的解釋:我在編譯的時候,用-L -l使程序正確編譯了,但是沒有指定運行時庫去哪些地方尋找庫,而默認的地方不包括/usr/loca/lib,這就造成了./a.out找不到libboost_program_options.so庫,也就出現了上面的問題。
缺點:
LD_LIBRARY_PATH是庫一般是在run-time linking搜索的路徑,但是使用這種方法不管在compiling linking還是run-time linking都是有嚴重的副作用
gcc/g++ -L在compiling linking搜索的路徑,保證你所編譯所需的符號是存在的
如果設置了LD_LIBRARY_PATH,那么你設置的路徑會優先尋找,而且比默認的標準路徑還要早。
新聞熱點
疑難解答