共享庫(.so)文件需要在鏈接時呈現(或指定)嗎?共享庫(.so)文件需要在鏈接時呈現(或指定)嗎?
我讀過這裏(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必須出現在編譯時,但根據我的經驗,這是不正確的?
沒有共享庫只是在運行時使用dlopen
和dlsym
鏈接,以便該應用程序鏈接時該庫可能不存在於系統上?
共享庫(.so)文件需要在鏈接時呈現(或指定)嗎?共享庫(.so)文件需要在鏈接時呈現(或指定)嗎?
我讀過這裏(Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?).so文件必須出現在編譯時,但根據我的經驗,這是不正確的?
沒有共享庫只是在運行時使用dlopen
和dlsym
鏈接,以便該應用程序鏈接時該庫可能不存在於系統上?
大多數shared libraries需要在構建時和運行時都存在。請注意,共享庫是而不是DLL(這是Windows的東西)。
我假設你的代碼爲Linux。其他操作系統的細節不同(而且它們很重要)。例如,如果您正在編譯Qt應用程序,那麼在構建應用程序和運行應用程序時都需要Qt共享庫(如/usr/lib/x86_64-linux-gnu/libQt5Gui.so
等)。閱讀關於動態鏈接器ld-linux.so(8) &約ELF。
但是您在詢問plugins的dynamic loading(使用dlopen(3)與dlsym(3) ...)。 然後閱讀萊文的Linkers & Loaders,Program Library HowTo,C++ dlopen mini HowTo和Drepper的How To Write Shared Libraries
參見this answer。
一些庫和框架試圖以操作系統中立的方式抽象插件的加載。閱讀例如約Qt plugins支持,或約POCO shared libraries(名字不好,它是關於插件)。
你可以擁有它,它一切正常。
雖然與庫目前在編譯的時候,通過的dlopen /調用LoadLibrary顯式的,而不是GET庫,你可以使用所有的功能直接
如果在編譯時指定,共享庫將充當靜態庫,還是會在運行時動態鏈接? – Shuzheng
後者:動態運行時。 –
這裏有一個竅門,以避免您在編譯時的程序.so
文件:
您可以隨時創建一個模擬C/C++接口,並將實現中的方法保留爲空,然後在您使用該程序後再將它們鏈接起來。但是,在這種情況下,您必須明確地編譯代碼以創建空函數的共享庫,然後再創建實現的庫。
例如,在CMake中,您可以使用ADD_LIBRARY
添加將創建共享庫的源代碼。
ADD_LIBRARY(MyLibName SHARED empty1.cpp empty2.cpp -fPIC)
這將創建一個.so
文件,並與它鏈接程序最終當你與它連接你的可執行文件。在運行時,您可以選擇任何您想要的.so
文件。
-fPIC
是創建「位置獨立代碼」的g ++標誌,因此.so
庫中的函數名稱不會發生錯位。
當然,這是您自己的庫的選項,但不是您在外部使用的庫,如Qt。除非你想嘲笑Qt庫,這並不那麼簡單。
只需在本網站上搜索「未定義參考」的問題,就會發現有必要的情況。我會爭論大多數人,手冊'dlopen'是相當專業的用途。 – Mat
什麼時候需要,什麼時候不需要? – Shuzheng
嘗試編譯一段調用'dlopen',沒有'-ldl'鏈接標誌的代碼。對於正常使用共享庫來說,「幾乎總是」是必要的。 – Mat