2012-11-12 79 views
5

我想在Linux上構建一個小型Qt(C++)GUI應用程序,但無法構建大量鏈接程序錯誤,抱怨我鏈接的Qt庫缺少依賴關係。我在Qt庫上使用ldd來驗證這些庫確實存在 - 它們是。如何自動鏈接到共享庫的依賴關係

我的問題似乎在這個線程進行相關的討論: Linking dependencies of a shared library 雖然該線程幫我找出我的問題準確,似乎該線程的結論是,我的應用程序應該鏈接!

應用程序被編譯使用下面的命令:

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread 

運行該產生以下形式的警告,和鏈接最終失敗與未定義的參考誤差(在「缺失」庫中定義的符號):

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 

等(共計有18個依賴關係可能不會被發現。)

我能得到這個,如果我編譯去明確地添加-lglib,-lpng14,-lz -lfreetype等,但正如我所提到的那樣,有18個依賴 - 我寧願不這樣做。我似乎也不應該這樣做。

我在我的筆記本電腦上編譯了同樣的項目,它使用完全相同的Linux Distro(openSuse 12.2),沒有任何問題。所有庫,包括Qt,都是從發行版安裝的。

我認爲這可能是我的openSuse安裝的某種設置問題,但我不知道從哪裏開始尋找解決這個問題。

歡呼聲中,克雷格

+0

我同意,它應該只是您無需添加所有的依賴庫工作。我懷疑某種系統配置有誤。也許重新安裝工具鏈的各個部分,比如編譯器和binutils,可能有助於......? –

+0

使用Yast我刪除binutils,然後重新安裝gcc工具,現在它工作。感謝您的回覆。 –

回答

1

看來,/usr/lib64/libQtGui.so已經硬編碼在其中rpaths查找相關共享庫。在你的一臺主機上,所需的磁帶庫位於預期位置,而在另一臺主機上卻不在。

你可以使用類似elfdump的東西來獲得QT共享庫中的RPATH以找出它的外觀。然後,您可以在鏈接命令行上使用(我相信)-R,將其指向安裝在該主機上的庫實際上的位置。

編輯:我認爲你可以做這樣的事情objdump -x <binary/library> | grep -i rpath

+0

按照Jamey的建議,對於我來說固定的東西,但只是跟上你的答案。 openSuse不附帶elfdump。任何想法如何找到嵌入在這個系統上的精靈文件的RPATH。我嘗試了objdump和readelf,並在其輸出中找到了對庫的引用,但沒有提及RPATH。 –

+0

我爲此使用'chrpath'。在Debian中,它在'chrpath'包中,毫不奇怪。 :-)我想'objdump'也可以工作,但是如果二進制文件中沒有rpath,你根本看不到任何輸出,所以很難判斷它是否工作,而沒有找到一個rpath-encumbered二進制文件來測試。 –