模块和共享库之间的区别?

时间:2011-01-30 22:26:27

标签: module linker shared-libraries cmake

标题主要涵盖它,模块和共享库之间有什么区别?我刚刚在CMake的add_library命令中找到了这个区别,他们说:

  

SHARED库是动态链接的,并在运行时加载。 MODULE库是未链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载。

但我可以使用dlopen()加载共享对象,不是吗?

3 个答案:

答案 0 :(得分:24)

不同之处在于您可以使用链接器链接到SHARED库,但无法使用链接器链接到MODULE。在一些平台上。

所以......要完全跨平台并且无处不在CMake工作,你永远不应该这样做:

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

公平地说,在Windows上,它们都只是dll,所以这段代码可能确实有效。但是当你把它带到一个无法链接到MODULE的平台上时,你会遇到一个错误。

底线:如果您需要链接到库,请使用SHARED。如果您确保库动态加载,那么使用MODULE是安全的。 (甚至可能更喜欢帮助检测某人是否尝试链接到它...)

答案 1 :(得分:5)

我认为所做的区别在于,共享库是由开发人员在编译时指定的,并且必须存在才能运行应用程序,即使它们的方法是在运行时加载的。模块(即插件)在运行时添加额外的支持,但不是必需的。是的,您可以dlopen()一个共享库,但在这种情况下,它不会被指定为程序的必需部分,而是作为模块运行。

答案 2 :(得分:1)

另一个区别在于..._OUTPUT_DIRECTORY..._OUTPUT_NAME的处理方式:

  

模块库始终被视为库目标。对于非DLL平台,共享库被视为库目标。对于DLL平台,共享库的DLL部分被视为运行时目标,相应的导入库被视为归档目标。包括Cygwin在内的所有基于Windows的系统都是DLL平台。

例如,这意味着如果您在Windows上编译SHARED库,LIBRARY_OUTPUT_DIRECTORY将被忽略,因为它正在查看ARCHIVE_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORY