2012-11-02 74 views
0

我在瞭解共享對象(.so)/動態鏈接庫(.dll)。由於我只在Linux上,因此.so文件是相關的。無論如何,當我編譯一個共享庫時,我得到了多個.so文件 - 其中大多數只是鏈接。下面是截圖:Qt生成多個.so文件 - 使用哪一個?

enter image description here

然後,我創建了另一個Qt的控制檯應用程序項目,因此,測試這一點。我已經建立了所有的頭文件,複製從以前的每截圖.so文件到這個新項目,並添加

LIBS += "libAritmeticnoKodiranjeDLL.so" 

項目設置。如果我編譯這個項目,它會通過OK。但在運行我的測試應用程序時,我得到這個錯誤:

./DLLTester:錯誤而載入共享庫:libAritmeticnoKodiranjeDLL.so.1:無法打開共享對象文件:沒有這樣的文件或目錄

在哪裏問題以及爲什麼我會得到如此多的.so文件?

+1

爲什麼這樣做是這樣解釋這裏:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html –

+0

謝謝你,有趣的閱讀洞察力。但是,我找不到Qt使用它們的具體方式,甚至更進一步,我的方式會出現什麼問題 - 這是報告無法找到SO的問題。 –

回答

1

只要做到:

LIBS += -lAritmeticnoKodiranjeDLL 

庫前綴(「LIB」)和後綴(「所以」)的細節將被鏈接器的照顧。

+0

不幸的是,我現在得到*: - 1:錯誤:錯誤:AritmeticnoKodiranjeDLL:沒有這樣的文件或目錄*。 –

+0

哎呀,我的意思是'-lAritmeticnoKodiranjeDLL'。自從我使用qmake以來已經有一段時間了。另外,您可能需要添加'-L/path/to/directory /',以便鏈接程序可以找到該庫。 –

+0

如果該目錄不在默認庫搜索路徑之一中,您可能還必須設置「LD_LIBRARY_PATH」。 –

1

請注意,除了一個之外,所有的都只是符號鏈接,實際的文件是最精確版本的文件。這是爲了支持不同版本的庫,符號鏈接決定版本未完全定義時使用的確切版本。如果您將libs安裝到系統庫文件夾中,這是非常重要的,但如果您只是將一個非共享版本與應用程序一起分發,則可以使用不帶版本號的名稱。

使用自定義庫運行應用程序時,需要將目錄添加到LD_LIBRARY_PATH環境變量中,以便運行時鏈接程序找到它們。請參閱https://stackoverflow.com/search?q=LD_LIBRARY_PATH。對於故障排除,您可以運行ldd yourprogram來查看實際加載的共享庫,並且echo $LD_LIBRARY_PATH可以讓您確保LD_LIBRARY_PATH是您認爲的。

+0

感謝您的評論,我編輯了'LD_LIBRARY_PATH'並遵循了@Kyle的建議,但是我無法實現。你能幫助我們嗎(見最後的評論)? :) –

+0

添加了一些疑難解答提示的答案。 – hyde

1

構建一個共享庫(使用TEMPLATE = lib),那麼產生的目標是libName.so(當CONFIG += unversioned_libname)或libNAME.so.1.0.0(當我可以肯定從我目前的經驗,QtCreator 4.0.3使用Qt 5.7的Linux(Ubuntu的16.04)下確認時CONFIG不變)。然而,使用相同環境構建的應用程序在鏈接期間正確地鏈接到該庫(LIBS += -Lfolder -lNAME),但不幸在運行期間它請求linName.so.1,因爲「應用程序輸出」說error while loading shared libraries: libNAME.so.1: cannot open shared object file: No such file or directory(我可以在應用程序的生成二進制文件中看到libName.so.1,但NOWHERE否則 - 不在Make文件中)。我已花了2個工作日的時間來全力以赴。唯一的方法是手動更改生成的.so文件的名稱以適應應用程序請求。