2017-02-03 19 views
2

共享庫(.so)文件需要在鏈接時呈現(或指定)嗎?共享庫(.so)文件需要在鏈接時呈現(或指定)嗎?

我讀過這裏(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必須出現在編譯時,但根據我的經驗,這是不正確的?

沒有共享庫只是在運行時使用dlopendlsym鏈接,以便該應用程序鏈接時該庫可能不存在於系統上?

+0

只需在本網站上搜索「未定義參考」的問題,就會發現有必要的情況。我會爭論大多數人,手冊'dlopen'是相當專業的用途。 – Mat

+0

什麼時候需要,什麼時候不需要? – Shuzheng

+1

嘗試編譯一段調用'dlopen',沒有'-ldl'鏈接標誌的代碼。對於正常使用共享庫來說,「幾乎總是」是必要的。 – Mat

回答

3

大多數shared libraries需要在構建時和運行時都存在。請注意,共享庫是而不是DLL(這是Windows的東西)。

我假設你的代碼爲Linux。其他操作系統的細節不同(而且它們很重要)。例如,如果您正在編譯Qt應用程序,那麼在構建應用程序和運行應用程序時都需要Qt共享庫(如/usr/lib/x86_64-linux-gnu/libQt5Gui.so等)。閱讀關於動態鏈接器ld-linux.so(8) &約ELF

但是您在詢問pluginsdynamic loading(使用dlopen(3)dlsym(3) ...)。 然後閱讀萊文的Linkers & LoadersProgram Library HowToC++ dlopen mini HowTo和Drepper的How To Write Shared Libraries

參見this answer

一些庫和框架試圖以操作系統中立的方式抽象插件的加載。閱讀例如約Qt plugins支持,或約POCO shared libraries(名字不好,它是關於插件)。

+0

那麼,共享庫是否可以用於動態加載?是否必須在鏈接時指定.so文件,以便程序明確引用調用中的函數,而不是間接使用dlopen()? – Shuzheng

+0

您需要閱讀我提供給您的所有參考資料(並且您需要一週以上才能閱讀所有內容)。細節是特定於操作系統的。 –

+0

謝謝,我會的! – Shuzheng

0

你可以擁有它,它一切正常。

雖然與庫目前在編譯的時候,通過的dlopen /調用LoadLibrary顯式的,而不是GET庫,你可以使用所有的功能直接

+0

如果在編譯時指定,共享庫將充當靜態庫,還是會在運行時動態鏈接? – Shuzheng

+0

後者:動態運行時。 –

0

這裏有一個竅門,以避免您在編譯時的程序.so文件:

您可以隨時創建一個模擬C/C++接口,並將實現中的方法保留爲空,然後在您使用該程序後再將它們鏈接起來。但是,在這種情況下,您必須明確地編譯代碼以創建空函數的共享庫,然後再創建實現的庫。

例如,在CMake中,您可以使用ADD_LIBRARY添加將創建共享庫的源代碼。

ADD_LIBRARY(MyLibName SHARED empty1.cpp empty2.cpp -fPIC) 

這將創建一個.so文件,並與它鏈接程序最終當你與它連接你的可執行文件。在運行時,您可以選擇任何您想要的.so文件。

-fPIC是創建「位置獨立代碼」的g ++標誌,因此.so庫中的函數名稱不會發生錯位。

當然,這是您自己的庫的選項,但不是您在外部使用的庫,如Qt。除非你想嘲笑Qt庫,這並不那麼簡單。