2013-01-06 62 views
1

我編譯我的代碼但失敗了。-L/libpath和/etc/ld.so.conf配置在gcc/g ++中編譯的libpath有什麼區別

# g++ -g test.cpp -o test -lboost_filesystem         
/tmp/cc5yybJZ.o(.text+0xb0): In function `__static_initialization_and_destruction_0': 
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()' 
/tmp/cc5yybJZ.o(.text+0xbc):/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()' 
/tmp/cc5yybJZ.o(.text+0xc8):/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()' 
/tmp/cc5yybJZ.o(.gnu.linkonce.t._ZN5boost10filesystem9file_sizeERKNS0_4pathE+0x19): In function `boost::filesystem::file_size(boost::filesystem::path const&)': 
/usr/local/include/boost/filesystem/operations.hpp:447: undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)' 
collect2: error: ld returned 1 exit status 

,但它是成功的,當我和編譯-L的/ usr/

g++ -g test.cpp -o test -lboost_filesystem -L/usr/local/lib 

/usr/local/lib已經在/etc/ld.so.conf

# cat /etc/ld.so.conf 
include ld.so.conf.d/*.conf 
/usr/lib64 
/usr/local/lib 
/usr/local/mpc/lib 
/usr/local/mpfc/lib 

是什麼原因配置local/lib目錄?
-L/libpath和/etc/ld.so.conf配置libpath有什麼不同?

回答

4

/etc/ld.so.conf由動態鏈接器使用(請參閱聯機幫助頁ld.so(8))以找出要搜索庫文件的路徑。這發生在運行時。

您仍然需要通過-L/usr/local/libgcc,這會將其傳遞到ld(請參閱手冊頁ld(1))。這發生在編譯時。

爲什麼gccld只能自動查找/etc/ld.so.conf中的路徑?我猜想一些可能的原因:(1)像這樣有更多的自動行爲使系統更復雜,更難以理解; (2)gcc在具有不同動態鏈接器的系統上運行(或根本沒有); (3)也許這種行爲不是你想要的,然後你需要一些額外的方式來關閉它。

在任何情況下,在大多數Linux系統上,您只需要一個軟件包管理器,將庫放在正確的位置(通常爲/usr/lib),所以這通常不是問題。否則,通常只定義您自己的CFLAGS變量以包含必要的-L...指令。

也可以配置gcc通過修改spec file來自動傳遞各種-L...指令(等等)。

2

/etc/ld.so.conf是一個運行時的東西 - 它允許Linux找到您的可執行文件需要運行的共享庫。

您可以通過在您的環境中定義$ LD_LIBRARY_PATH來擴充/etc/ld.so.conf。

另一方面,「-L」完全用於鏈接您的程序。這是一個「ld」的事情。在你的g ++命令中指定「-L」應該修復你的鏈接錯誤。

您可以使用「ldd」命令查看二進制文件需要哪些共享庫以及它希望在哪些環境中找到它們。

相關問題