2011-01-30 47 views
25

標題主要涵蓋它,模塊和共享庫有什麼區別?我剛剛在CMake的add_library命令中發現了這種區別,他們說:模塊和共享庫之間的區別?

SHARED庫在運行時動態鏈接並加載。 MODULE庫是沒有鏈接到其他目標的插件,但可以在運行時使用類似dlopen的功能動態加載。

但我可以使用dlopen()加載共享對象,不是嗎?

回答

22

不同的是,你可以鏈接到一個共享庫的鏈接,但你不能鏈接到與連接器的模塊。 部分平臺。

所以......是完全跨平臺和無處不在的CMake工程工作,你不應該這樣做:

# This is a big NO-NO: 
add_library(mylib MODULE ${srcs}) 
target_link_libraries(myexe mylib) 

爲了公平起見,在Windows上,他們都只是dll文件,因此該代碼實際上可能工作。但是當你把它帶到一個無法鏈接到MODULE的平臺上時,你會遇到一個錯誤。底線:如果您需要鏈接到庫,請使用SHARED。如果你保證圖書館將只有動態加載,那麼使用MODULE是安全的。 (甚至最好來幫助檢測是否有人確實嘗試鏈接到它...)

+0

有誰知道哪個平臺上,這可能是一個問題? – mhsmith 2017-04-17 21:05:24

5

我認爲所取得的區別是,共享庫是由在編譯時開發商指定,必須出現在應用程序運行,即使他們的方法是在運行時加載。一個模塊,即插件,在運行時增加額外的支持,但不是必需的。是的,你可以dlopen()一個共享庫,但在這種情況下,它不會被指定爲程序和函數的必需部分,而是作爲一個模塊。

1

另一個不同之處是如何..._OUTPUT_DIRECTORY..._OUTPUT_NAME的處理:

模塊庫始終是作爲庫處理目標。對於非DLL平臺,共享庫被視爲庫目標。對於DLL平臺,共享庫的DLL部分被視爲運行時目標,並將相應的導入庫視爲存檔目標。包括Cygwin在內的所有基於Windows的系統都是DLL平臺。

例如,這意味着如果你在Windows編譯SHARED庫,LIBRARY_OUTPUT_DIRECTORY將被忽略,因爲它在尋找ARCHIVE_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORY代替。