标题主要涵盖它,模块和共享库之间有什么区别?我刚刚在CMake的add_library
命令中找到了这个区别,他们说:
SHARED库是动态链接的,并在运行时加载。 MODULE库是未链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载。
但我可以使用dlopen()加载共享对象,不是吗?
答案 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_DIRECTORY
和RUNTIME_OUTPUT_DIRECTORY
。