如何使用包含 C++20 模块的静态库

How to use static library that contains C++20 modules

我有一个包含以下模块的静态库项目UserInterface

// Foo.ixx
export module Foo;

export void MyFunc();

void MyFunc()
{
    []() {};
}

模块 Foo 像这样导入到库的主 header 中:

// NuiLibrary.hpp
#pragma once

import Foo;

// Windows
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

// other includes

我无法构建解决方案,我可以构建静态库,但在我引用该库的 Sculpt 项目中,我收到以下错误:

经过大量搜索,我认为这是因为需要通过设置 Additional Module Dependencies 将模块显式包含在客户端解决方案中。

它的语法是什么? 尽管设置了这个,为什么它不能正常工作:

原因是什么?

经过一天的尝试后,我的具体问题是 Microsoft Package Server 文件锁定 .ifc 文件导致 could not find module 错误。

如何检测?

您可以通过右键单击模块 -> Compile 尝试自行编译模块来确定是否存在此问题。然后它将无法编译文件并出现错误 could not open the file another process is using it.

(非)解决方案

一气之下,我只是在我的静态库项目设置中将所有内容设置为默认值,现在它可以正常工作了。

这肯定是什么原因造成的

配置解决方案时,您必须执行以下操作:

  • 在客户端项目中添加对静态库项目的引用(这将消除客户端项目的错误)
  • 在静态库中转到 Project Settings->C/C++->General 并勾选 Scan sources for module dependencies (这将消除库项目中的错误)

其他问题

在 Visual Studio 2019 的旧版本中,当您将文件从 .hpp 重命名为 .ixx 时,编译器仍会将文件识别为头文件。 要解决此问题,请转到文件属性并将 Item type 设置为 C/C++ compiler 而不是 C/C++ header.

在Visual Studio 2019的当前版本中,当您创建模块文件时,您需要转到文件属性C/C++->Precompiled headers->Precompiled Header并单击Not using precompiled header。 这将修复以下讨厌的错误:

虽然我对 Visual Studio 中的模块没有任何经验,但我仍然能看到一些奇怪的东西。

Header 文件不应与我们在您的 NuLibrary.hpp 文件中看到的模块一起使用。虽然语法看起来没问题,但如果 header 包含在声明模块的其他源文件的全局模块片段 (GMF) 中,则会出现问题,因为导入声明可能不会出现在 GMF 中:

// some source file including your header
module;

#include "NuLibrary.hpp" // --> ERROR! import declaration..

我建议完全忘记拥有模块项目的“main header”的想法,而是将所有功能放在项目的模块接口文件中:

// NuLibrary.cpp
module;

// Windows
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

// other includes

export module nulibrary;
import Foo;

[...]

我想 Visual Studio 如果你有那个文件 .ixx-extension..