标题主要涵盖它,模块和共享库有什么区别?我刚刚在CMake的add_library
命令中发现了这种区别,他们说:模块和共享库之间的区别?
SHARED库在运行时动态链接并加载。 MODULE库是没有链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载。
但我可以使用dlopen()加载共享对象,不是吗?
标题主要涵盖它,模块和共享库有什么区别?我刚刚在CMake的add_library
命令中发现了这种区别,他们说:模块和共享库之间的区别?
SHARED库在运行时动态链接并加载。 MODULE库是没有链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载。
但我可以使用dlopen()加载共享对象,不是吗?
不同的是,你可以链接到一个共享库的链接,但你不能链接到与连接器的模块。 部分平台。
所以......是完全跨平台和无处不在的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
代替。
有谁知道哪个平台上,这可能是一个问题? – mhsmith 2017-04-17 21:05:24