Headers 主要涵盖它,模块和共享库之间有什么区别?我刚刚在CMake的 add_library 命令中找到了这个区别,他们说:
add_library
SHARED库动态链接并在运行时加载 . MODULE库是未链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载 .
但我可以使用dlopen()加载共享对象,不是吗?
不同之处在于您可以使用链接器链接到SHARED库,但无法使用链接器链接到MODULE . 在某些平台上 .
所以...要完全跨平台并且无处不在CMake工作,你永远不应该这样做:
# This is a big NO-NO: add_library(mylib MODULE ${srcs}) target_link_libraries(myexe mylib)
公平地说,在Windows上,它们都只是dll,所以这段代码可能确实有效 . 但是当你把它带到一个无法链接到MODULE的平台上时,你会遇到一个错误 .
底线:如果您需要链接到库,请使用SHARED . 如果您保证只能动态加载库,那么使用MODULE是安全的 . (甚至可能更愿意帮助检测是否有人试图链接到它...)
我认为所做的区别在于,共享库是由开发人员在编译时指定的,并且必须存在才能运行应用程序,即使它们的方法是在运行时加载的 . 模块(即插件)在运行时添加额外的支持,但不是必需的 . 是的,您可以dlopen()一个共享库,但在这种情况下,它不会被指定为程序的必需部分,而是作为模块运行 .
另一个区别在于如何处理..._OUTPUT_DIRECTORY和..._OUTPUT_NAME:
模块库始终被视为库目标 . 对于非DLL平台,共享库被视为库目标 . 对于DLL平台,共享库的DLL部分被视为运行时目标,相应的导入库被视为存档目标 . 包括Cygwin在内的所有基于Windows的系统都是DLL平台 .
例如,这意味着如果在Windows上编译 SHARED 库, LIBRARY_OUTPUT_DIRECTORY 将被忽略,因为它正在查看 ARCHIVE_OUTPUT_DIRECTORY 和 RUNTIME_OUTPUT_DIRECTORY .
SHARED
LIBRARY_OUTPUT_DIRECTORY
ARCHIVE_OUTPUT_DIRECTORY
RUNTIME_OUTPUT_DIRECTORY
3 回答
不同之处在于您可以使用链接器链接到SHARED库,但无法使用链接器链接到MODULE . 在某些平台上 .
所以...要完全跨平台并且无处不在CMake工作,你永远不应该这样做:
公平地说,在Windows上,它们都只是dll,所以这段代码可能确实有效 . 但是当你把它带到一个无法链接到MODULE的平台上时,你会遇到一个错误 .
底线:如果您需要链接到库,请使用SHARED . 如果您保证只能动态加载库,那么使用MODULE是安全的 . (甚至可能更愿意帮助检测是否有人试图链接到它...)
我认为所做的区别在于,共享库是由开发人员在编译时指定的,并且必须存在才能运行应用程序,即使它们的方法是在运行时加载的 . 模块(即插件)在运行时添加额外的支持,但不是必需的 . 是的,您可以dlopen()一个共享库,但在这种情况下,它不会被指定为程序的必需部分,而是作为模块运行 .
另一个区别在于如何处理..._OUTPUT_DIRECTORY和..._OUTPUT_NAME:
例如,这意味着如果在Windows上编译
SHARED
库,LIBRARY_OUTPUT_DIRECTORY
将被忽略,因为它正在查看ARCHIVE_OUTPUT_DIRECTORY
和RUNTIME_OUTPUT_DIRECTORY
.