2010-10-27 83 views
2

我在沙箱目錄中安裝了一些共享/動態庫。我正在構建一些鏈接庫的應用程序。我在這方面遇到了OSX和Linux之間的區別,我不確定(最好的)解決方案是什麼。如何鏈接本地目錄中的共享庫,OSX vs Linux

在OSX上,庫自身的位置被記錄到庫中,以便如果應用程序鏈接到庫,則可執行文件知道在運行時在哪裏查找庫。這與我的沙盒中預期的一樣,因爲可執行文件在那裏查找,而不是系統範圍的安裝路徑。

在Linux上,我無法使其工作。顯然,圖書館本身並不存在圖書館的位置。據我瞭解,您必須將包含庫的文件夾添加到/etc/ld.so.conf,並通過運行ldconfig重新生成ld緩存。

這似乎並沒有爲我做伎倆,因爲我的圖書館位於用戶主目錄內。它看起來像ldconfig不喜歡,這實際上是有道理的。

我該如何解決這個問題?我不想將這些庫移出我的沙箱。

回答

2

在Linux上,使用設置爲沙盒目錄的環境變量LD_LIBRARY_PATH運行程序。

(我記得使用的標誌-R包括二進制庫路徑,但它要麼已從gcc刪除或它僅適用於BSD系統。)

+0

我莫名其妙地被使用以爲LDCONFIG LD_LIBRARY_PATH。我不知道你可以動態改變它。它像一個魅力。謝謝! – 2010-10-27 14:14:46

+0

我投了這個答案,我的錯誤:-p – 2011-04-14 10:14:02

+0

'-Wl,-rpath,/ path/to/sandbox' – Jed 2014-02-10 06:29:40

1

在Linux上,你應該設置LD_RUN_PATH到您的沙箱目錄。這比設置LD_LIBRARY_PATH好,因爲您要告訴鏈接器庫的位置在鏈接時間,而不是告訴共享庫加載程序在運行時間

參見:http://xahlee.org/UnixResource_dir/_/ldpath.html

+0

這種方式似乎將RPATH設置爲二進制文件,對於沙盒應用程序來說可能沒問題,但通常會使它不可能移動應用程序。 – 2011-04-14 11:32:20

+0

沙盒應用程序在這裏是有問題的。 「移動應用程序」是什麼意思?二進制分佈?在這種情況下,LD_RUN_PATH將不起作用。 – 2011-04-14 11:43:57