标题已经涵盖了主要内容,模块和共享库有什么区别?我在CMake的add_library
命令中发现了这个区别,他们说:
共享库是动态链接并在运行时加载的。模块库是插件,不会链接到其他目标中,但可以使用类似于dlopen的功能在运行时动态加载。
但我可以使用dlopen()来加载共享对象,对吗?
标题已经涵盖了主要内容,模块和共享库有什么区别?我在CMake的add_library
命令中发现了这个区别,他们说:
共享库是动态链接并在运行时加载的。模块库是插件,不会链接到其他目标中,但可以使用类似于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
:SHARED
库,LIBRARY_OUTPUT_DIRECTORY
将被忽略,因为它会查看 ARCHIVE_OUTPUT_DIRECTORY
和 RUNTIME_OUTPUT_DIRECTORY
。