2011-01-30 84 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代替。

相关问题