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