首页 文章

模块和共享库之间的区别?

提问于
浏览
27

Headers 主要涵盖它,模块和共享库之间有什么区别?我刚刚在CMake的 add_library 命令中找到了这个区别,他们说:

SHARED库动态链接并在运行时加载 . MODULE库是未链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载 .

但我可以使用dlopen()加载共享对象,不是吗?

3 回答

  • 1

    不同之处在于您可以使用链接器链接到SHARED库,但无法使用链接器链接到MODULE . 在某些平台上 .

    所以...要完全跨平台并且无处不在CMake工作,你永远不应该这样做:

    # This is a big NO-NO:
    add_library(mylib MODULE ${srcs})
    target_link_libraries(myexe mylib)
    

    公平地说,在Windows上,它们都只是dll,所以这段代码可能确实有效 . 但是当你把它带到一个无法链接到MODULE的平台上时,你会遇到一个错误 .

    底线:如果您需要链接到库,请使用SHARED . 如果您保证只能动态加载库,那么使用MODULE是安全的 . (甚至可能更愿意帮助检测是否有人试图链接到它...)

  • 24

    我认为所做的区别在于,共享库是由开发人员在编译时指定的,并且必须存在才能运行应用程序,即使它们的方法是在运行时加载的 . 模块(即插件)在运行时添加额外的支持,但不是必需的 . 是的,您可以dlopen()一个共享库,但在这种情况下,它不会被指定为程序的必需部分,而是作为模块运行 .

  • 5

    另一个区别在于如何处理..._OUTPUT_DIRECTORY..._OUTPUT_NAME

    模块库始终被视为库目标 . 对于非DLL平台,共享库被视为库目标 . 对于DLL平台,共享库的DLL部分被视为运行时目标,相应的导入库被视为存档目标 . 包括Cygwin在内的所有基于Windows的系统都是DLL平台 .

    例如,这意味着如果在Windows上编译 SHARED 库, LIBRARY_OUTPUT_DIRECTORY 将被忽略,因为它正在查看 ARCHIVE_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORY .

相关问题