共享库和 c++20 模块

Tou*_*dou 9 c++ shared-libraries c++20 c++-modules

关于如何在共享库中正确使用 C++20 模块的在线文档非常少。许多人显然 感兴趣,但我一直无法找到明确的解决方案。

在MSVC中,您需要dllexport在编译库和dllimport使用符号时使用。这可以使用“旧版 C++”中的宏来完成,但这不适用于 C++20 模块,因为无论预处理器指令如何,代码仅编译一次。

这篇文章建议您现在只需要使用dllexportdllimport编译器会自动处理。然而,这来自一条现已被删除的评论,而且我找不到有关该主题的任何可靠来源。

如何使用 C++20 模块创建共享库?

dar*_*low 4

C++20 模块与共享库没有特殊关系。它们主要是头文件的替换。

这意味着您将使用 C++20 模块开发共享库,其方式与使用 C++20 之前的头文件类似,至少按照我目前的理解是这样。您设计一些导出的 API(不幸的是仍然使用特定于供应商的属性,如__declspec(dllexport)__attribute__((visibility("default"))))并实现它。您可以像以前一样构建共享库文件 (.dll/.so) 和用于分发的导入库。但是,您可以分发模块接口单元,而不是分发头文件。export module ABC;模块接口单元是顶部包含声明的文件。

然后,使用该共享库的可执行文件将使用 导入该模块import ABC;,而不是#include使用 -ing 头文件。

编辑:正如评论中所指出的,在 Windows 上似乎仍然有必要在模块接口内提供一个宏开关,用于在 dllexport 和 dllimport 属性之间切换,类似于对标头所做的操作。但是,我目前还没有对此进行实验,只能遵循 @jeremyong 在C++ 模块和动态链接的预期关系是什么?中进行的实验。

  • 这并不能回答问题。模块接口单元是在这些声明中使用“__declspec(dllexport)”构建的。但要“导入”着色器库函数,您需要一个声明“__declspec(dllimport)”。模块系统是否理解这一点并在导入时自动将“dllexport”转换为“dllimport”,或者您是否必须使用不同的声明构建新模块? (3认同)
  • 谢谢。如果有微软的官方文档来证实这一点那就太好了。 (3认同)