[英]Linux: How to find out which (sub) dependency of my library needs a specific library?
標題可能看起來很復雜。
我制作了一個要在Tcl腳本中加載的庫。 現在我需要將其轉移到Ubuntu 12.04上 。 Tclsh給出以下錯誤:
couldn't load file "/apollo/applications/Linux-PORT/i586/lib/libapmntwraptcl.so":
**libgeos-3.4.2.so**:
cannot open shared object file: No such file or directory
while executing "load $::env(ACCLIB)/libapmntwraptcl[info sharedlibextension]"
libgeos庫在Ubuntu 12.04下沒有3.4.2版本。 因此,我需要知道我的庫的哪個(子)依賴項需要著名的libgeos-3.4.2.so,以便可以重新構建它或找到替代方法。
提前謝謝了。
編輯:
感謝您的有用答案。 我已經做了ldd -v或-r。 當我執行ldd -r時,我有200多個依賴項。 最糟糕的是,在結果列表中我看到libgeos-3.3.8.so => /usr/lib/libgeos-3.3.8.so(0xb3ea9000) (我有版本),但是當我執行時,Tclsh表示libgeos-3.4 2。如此失蹤。
這就是為什么我需要能夠告訴我庫的完整依賴關系樹的原因。
誰能給我一個提示(不是一些毫無用處的炫耀)?
非常感謝。
您無意間(可能沒有自己的過失)徘徊於“ DLL Hell”中; 問題是libapmntwraptcl.so
依賴的東西( 可能間接地)不滿足其依賴關系。 正是由於知道錯誤所在的工具(尤其是系統動態鏈接程序庫)默認情況下產生的信息量很少,因此很難解決這類問題。
更糟糕的是,您顯然有多個版本。 這就是DLL Hell達到其最壞的化身的地方。 您需要成為一名偵探才能解決這個問題; 明智地進行遠程操作太困難了,因為您戳手指的許多操作都是由前面的步驟確定的。
您需要使用ldd libapmntwraptcl.so
(在您的shell中,而不是在Tcl中)確切地確定要加載的版本。 您還需要仔細檢查有問題的load
命令之前的環境變量,因為其中一些變量會影響加載過程。 最簡單的方法是將parray env
放在有parray env
的load
之前,這會在可能出現故障的情況下產生所有內容的轉儲。 閱讀ld.so
的手冊頁將告訴您更多有關每種可能的麻煩候選人的信息(很多!)。
您可能還需要遍歷上面的ldd
程序標識的庫列表,並檢查每個庫是否也都以您期望的方式滿足了它們的所有依賴關系,並且還應該記住,無法使用ldd
進行定位可能並不意味着代碼實際上會失敗。 (那太簡單了。)
您還可以嘗試在load
之前將LD_DEBUG
環境變量設置為all
。 這將產生大量關於標准輸出的信息。 也許它將為您提供足夠的信息以找出問題所在?
最后,在Linux上,您需要記住,可以為特定的庫設置RPATH(這可能會影響找到它的位置),並且還有一個系統庫緩存也可能會影響事物。
我真的很抱歉錯誤消息沒有更好。 我真正能說的是,Tcl被告知出了什么問題了,幾乎沒有什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.