2015-02-11 45 views
0

我有2個C庫:GCC:靜態添加外部共享對象到編輯

  1. 依賴庫,編譯爲一個共享對象
  2. 我的圖書館 - 這也是我想編譯爲共享對象

我想要編譯我的圖書館成了共享目標,但我不希望要在運行時加載的依賴庫。

I.e.我希望依賴庫成爲我從庫創建的共享對象的一部分,因此在使用我的庫時,不需要將依賴項添加到LD_LIBRARY_PATH中。

我該如何與GCC做到這一點?

回答

2

這似乎是一個XY問題:您想要靜態添加一個SO 以避免使用LD_LIBRARY_PATH。允許我解決後者而忽略前者。 ;-)

LD_LIBRARY_PATH暫時覆蓋庫搜索路徑的一種手段。注意「覆蓋」:在LD_LIBRARY_PATH給出的路徑搜索第一,如果一個圖書館在他們發現,標準的搜索路徑認爲該庫。它「剔除」可能安裝在標準路徑中的其他版本。很容易看出這會如何產生令人驚訝和不必要的後果。它主要是調試功能,所以你是對的不想使用它。

有三個「正確」的方式來解決這個問題:

1)安裝依賴於標準的搜索路徑(/usr/lib/*//lib/*一個,檢查/etc/ld.so.conf的列表)。這將需要超級用戶權限。

2)的依賴關係的路徑添加到標準搜索路徑(在/etc/ld.so.conf)。這將需要超級用戶權限。

3)在編譯時配置依賴項到您的庫中的路徑(-Wl,-rpath=/path/to/lib/)。這會將給定的路徑添加到搜索的路徑通過這個庫只有。它不需要而不是需要任何特殊的特權,並且沒有LD_LIBRARY_PATH具有的缺點。

順便說一句,你可以檢查您的二進制文件沒有通過ldd <filename>「發現」它的庫。

+1

很好的建議。我想添加一個鏈接到http://xahlee.info/UnixResource_dir/_/ldpath.html,因爲我認爲這是一個非常好的解讀,任何人都試圖理解爲什麼'LD_LIBRARY_PATH'應該只用作調試工具。 – 2015-02-11 12:40:32