簡體   English   中英

Linux:如何找出我的庫的哪個(子)依賴項需要特定的庫?

[英]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 envload之前,這會在可能出現故障的情況下產生所有內容的轉儲。 閱讀ld.so的手冊頁將告訴您更多有關每種可能的麻煩候選人的信息(很多!)。

您可能還需要遍歷上面的ldd程序標識的庫列表,並檢查每個庫是否也都以您期望的方式滿足了它們的所有依賴關系,並且還應該記住,無法使用ldd進行定位可能並不意味着代碼實際上會失敗。 (那太簡單了。)

您還可以嘗試在load之前將LD_DEBUG環境變量設置為all 這將產生大量關於標准輸出的信息。 也許它將為您提供足夠的信息以找出問題所在?

最后,在Linux上,您需要記住,可以為特定的庫設置RPATH(這可能會影響找到它的位置),並且還有一個系統庫緩存也可能會影響事物。


我真的很抱歉錯誤消息沒有更好。 我真正能說的是,Tcl被告知出了什么問題了,幾乎沒有什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM