【问题标题】:How to compile/use header units in MSVC from command-line?如何从命令行编译/使用 MSVC 中的标头单元?
【发布时间】:2021-07-23 15:58:40
【问题描述】:

例如,我有以下玩具文件:

mod.hpp

#include <iostream>

使用.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 中创建/使用标头单元?

注意:我现在正在制作跨平台/跨编译器项目。这意味着我希望相同的源代码能够在 Windows 和 Linux 上的 MSVC/CLang/GCC 中编译。对我来说,将特定于 MSVC 的扩展名设为 .ixx/.cppm 是没有意义的,这就是我在案例中使用 .hpp/.cpp 的原因。不仅如此,我根本没有制作 .vcxproj/.sln 文件,我只考虑了在 MSVC 中编译的低级命令行调用。

我提出这个问题只是为了与现成的解决方案分享我的答案。

【问题讨论】:

    标签: c++ visual-c++ command-line module c++20


    【解决方案1】:

    要创建预编译头单元发出下一个命令:

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

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

    然后使用header unit发出命令:

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

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

    Hello, World!
    

    这样你就可以预编译任何头文件,包括像import &lt;iostream&gt;;这样的标准头文件。

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

    mod.hpp

    #include <iostream>
    

    使用.cpp

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

    【讨论】:

    • 模块文件定义不应在 Visual Studio(以及可能的其他构建系统)中使用 .hpp 和 .cpp 后缀。他们在 VS 中使用 .ixx 和 .cppm 后缀。你基本上是avoiding all of the special things VS does to help build module files。
    • @NicolBolas 你知道我为什么使用 .hpp/.cpp 吗?因为我现在正在制作跨平台/跨编译器项目,所以为了清楚起见,我可以在我的问题中做这个注释。这意味着我希望相同的源代码也能够在 CLang/GCC 中以及在 Win 和 Linux 上进行编译。这意味着没有必要制作特定于 MSVC 的扩展名 .ixx/.cppm。不仅如此,我现在根本不制作 vcxproj/sln 文件,我只考虑在 MSVC 中编译的低级命令行调用,而像上面这样的低级调用不需要任何特殊的扩展可编译。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多