2011-07-04 198 views
2
g++ -o Test Test.cpp -lTest 
/usr/bin/ld: cannot find -lTest 
collect2: ld returned 1 exit status 

如果共享/動態庫中的符號在運行時按需加載,那麼爲什麼在編譯時庫會丟失一個致命錯誤?爲什麼缺少共享庫致命?

回答

5
  1. 在運行時很難處理庫間依賴關係;編譯時檢查允許鏈接程序檢測並有時解析依賴關係循環,並將任何附加庫依賴關係添加到運行時鏈接列表中。
  2. 你想知道在編譯/鏈接時或者運行時拼錯了一個符號名嗎?大多數人更喜歡前者,因此鏈接器會檢查所有符號是否已解析,而不是將其推遲到運行時加載器;這當然需要所有的庫存在。
  3. 假設一個動態庫需要存在一個靜態庫,否則這個靜態庫不會被鏈接。在大多數平臺上,你不能(或者不能明智或安全地)在運行時加載靜態庫,所以鏈接器需要在鏈接時處理這些問題。 (這實際上是#1的子情況。)
+0

是否至少有一種方法可以禁用它?並不是說我有一個很好的理由,但是你會認爲他們會讓它成爲可選的。 – Maxpm

+0

我其實不會這麼想。如果你不想編譯/鏈接時間庫鏈接/加載,那麼在編譯時不要鏈接它;在運行時在程序中使用'dlopen()'。在編譯時進行鏈接是特別說你想編譯時檢查。 – geekosaur