【240903】C++ 的 module(模块)和动态链接库之间的关系

243 阅读2分钟

以下内容源自 GPT。

module(模块)和动态链接库之间的关系

C++ 模块(module)动态链接库(DLL) 是两种不同的概念,但可以结合使用。

  • 模块(module) :C++20 引入的新特性,主要用于提高代码编译效率和改善代码组织。模块允许将代码划分为独立的单元,减少对头文件的依赖。
  • 动态链接库(DLL) :DLL 是一种在运行时动态链接的库,允许多个程序共享相同的代码。DLL 需要导出函数和变量,以便其他程序在运行时能够访问它们。

关系:

  • 模块用于在编译时组织代码,提高编译效率。
  • DLL用于在运行时共享代码,提供动态链接功能。

结合:可以将模块中的功能编译进 DLL,然后使用传统的导出机制(如 __declspec(dllexport))来导出这些功能,以便其他程序动态加载和使用它们。

总结:C++20 引入的模块(module)确实为代码的组织和构建提供了一个更现代化的方式,但是它和传统的动态链接库(DLL)并不是完全等同的概念。模块化系统主要用于替代传统的头文件和源文件的包含方式,以提升编译速度和代码组织的效率。


问题:如果我不用传统的导出机制(如 __declspec(dllexport))来导出这些功能,那么其它程序还是无法加载它是吗?

是的,如果你不使用传统的导出机制(如 __declspec(dllexport))来导出 DLL 中的函数或变量,其他程序将无法在运行时加载和使用这些功能。

原因:
  • DLL 的本质:DLL 是运行时共享库,其他程序在运行时通过符号解析来调用 DLL 中的函数或访问变量。如果没有明确导出这些符号,外部程序就无法识别和访问它们。
  • 模块的作用:C++ 模块(module)主要是在编译时优化代码组织和编译过程,而不是用于控制符号在运行时的可见性。因此,模块本身不会影响 DLL 的导出与导入机制。
结论:

如果你希望其他程序在运行时能够加载和调用你在 DLL 中定义的模块中的功能,你仍然需要使用像 __declspec(dllexport) 这样的导出机制,否则这些功能在 DLL 中将是不可见的,外部程序无法加载或使用它们。