我有一個libA.so,這取決於libB.so,它位於../libB/(來自libA.c)。我試圖以這樣的方式編譯東西,我不必設置任何環境變量。我有:如何設置.so庫將搜索其他.so庫的路徑?
cc -std=c99 -c -fPIC -I../libB/ -Wall libA.c
cc -std=c99 -shared libA.o -L../libB -lB -o libA.so
這個編譯得很好。當我運行加載力霸使用dlopen我得到一個程序:
dyld: Library not loaded: libB.so
Referenced from: libA/libA.so
Reason: image not found
Trace/BPT trap: 5
所以力霸不會在運行時發現libB。我發現這個解決方案來改變Mac OS X上運行時路徑:
install_name_tool -change libB.so @loader_path /../ libB.so libA.so
,但我想找到一個解決方案,可以在OS X和Linux上運行。再一次,我試圖讓最終用戶儘可能少做,所以我不希望他們必須設置環境變量,我必須使用cc(對我來說,這是我的Apple LLVM版本4.2(鏗-425.0 .27)(基於LLVM 3.2svn),我也希望它能在Linux上工作,所以推測cc = gcc那裏)。
編輯我的問題可能比我意識到的要複雜。我在C中創建這個動態庫,但試圖從python中使用它。我可以在python中使用libB.so(它沒有依賴關係)沒有問題,當我從python中加載libA.so時,它發現它(見上面的錯誤),只是在那個時候,libA.so意識到它沒有問題,不知道在哪裏可以找到libB.so.如果我在下面正確理解你的答案,解決方案取決於在編譯可執行文件時設置鏈接器路徑,在我的情況下這是在Python中。
當我編譯它時,沒有辦法告訴libA.so在哪裏查找libB.so嗎?我之後可以在OSX上使用install_name_tool來完成它,但是編譯器沒有辦法在OSX和Linux上工作嗎?
感謝您的幫助。當我man cc時,我沒有看到rpath的任何選項。不幸的是我不得不使用cc。有任何想法嗎? – Dan 2015-04-03 19:40:04
當你說「cc」時,你需要更具體。 「cc」取決於系統。在Linux上它通常只是一個「gcc」的鏈接。無論如何,「rpath」是一個鏈接器選項,不是編譯器選項。因此請閱讀:man ld – kaylum 2015-04-03 20:05:46
如果不清楚。使用gcc(也可能是cc)選項可以通過-Wl選項傳遞給鏈接器。 – kaylum 2015-04-03 20:29:43