如何从 command-line compile/use header MSVC 中的单元?

How to compile/use header units in MSVC from command-line?

例如我有以下玩具文件:

mod.hpp

#include <iostream>

use.cpp

import "mod.hpp";

int main() {
    std::cout << "Hello, World!" << std::endl;
}

但是如果你像cl use.cpp /std:c++latest那样编译它,那么我会得到错误

error C7612: could not find header unit for 'mod.hpp'

如何在 MSVC 中 create/use header 单元?

注意:我现在正在制作 cross-platform/cross-compiler 项目。这意味着我希望相同的源能够在 Windows 和 Linux 上编译为 MSVC/CLang/GCC。对我来说,没有必要制作 MSVC-specific 扩展名 .ixx/.cppm,这就是我在我的案例中使用 .hpp/.cpp 的原因。此外,我根本没有制作 .vcxproj/.sln 文件,我只考虑 low-level 在 MSVC 中编译的命令行调用。

这个问题是我做的,只是为了与 ready-made 解决方案分享我的答案。

要创建预编译的 header 单元发出下一条命令:

cl /EHsc /std:c++latest /exportHeader mod.hpp

此命令创建 mod.hpp.ifc 文件,这是一个预编译的 header 单元模块。 Here 是关于 /exportHeader 标志的文档。

然后使用header单元发出命令:

cl /EHsc /std:c++latest use.cpp /headerUnit mod.hpp=mod.hpp.ifc

关于 /headerUnit 的文档是 here/headerUnit 接受参数 header-filename=ifc-filename。在上面的命令最终程序编译并输出之后:

Hello, World!

这样你就可以预编译任何 header,包括像 import <iostream>;.

这样的标准的

对于上面的命令,我使用了以下文件:

mod.hpp

#include <iostream>

use.cpp

import "mod.hpp";

int main() {
    std::cout << "Hello, World!" << std::endl;
}