5

我正在查看 clang 模块的驱动程序测试用例: https ://github.com/llvm-mirror/clang/blob/master/test/Driver/modules.cpp

它包括生成 .pcm.o 文件的步骤。我想知道它们是干什么用的。

给定一个 c++20 模块

// a-m.cc
module;
#include <iostream>
export module a;
export void do_a() { std::cout << "A\n"; }

您可以使用编译它

clang++ -std=c++20 -x c++-module --precompile a-m.cc -o a.pcm

生成预编译的模块文件a.pcm

但也有将 .pcm 文件编译为 .o 文件的步骤。

从驱动程序测试

clang++ -std=c++20 a.pcm -S -o a.pcm.o

.pcm.o 文件是如何使用的?

如果我写一个主程序

// main.cc
import a;

int main() {
    do_a();
    return 0;
}

编译

clang++ -std=c++20 -c main.cc -fmodule-file=a=a.pcm

然后尝试与.pcm.o链接,我得到

clang++ main.o a.pcm.o
/usr/bin/ld:a.pcm.o: file format not recognized; treating as linker script
/usr/bin/ld:a.pcm.o:2: syntax error
clang-13: error: linker command failed with exit code 1 (use -v to see invocation)

注意:可以编译 am.cc

clang++ std=c++20 -c a-m.cc -o a.o

并与 ao 链接,但 .pcm.o 文件是做什么用的?并且它们可以用来避免在您预编译 am.cc 后再次编译它吗?

4

1 回答 1

1

pcm 文件包含有关模块的“半成品”信息。文件扩展名不必是 pcm,我认为 Visual Studio 例如.ifc用作扩展名。(与 Visual Studio 的不同之处在于它同时输出 ifc 文件和编译目标文件 ( .obj),而 clang 分两个单独的步骤执行此操作)

pcm 文件以某种格式存储有关模块文件的信息,以便编译器可以轻松地将其导入或编译为其他目标文件。

您链接中的命令让我感到惊讶,我认为-S在示例中正在编译为程序集,所以我很惊讶它在您链接到的那个 clang 存储库中列出。

clang++ -std=c++20 a.pcm -S -o a.pcm.o # To mee this looks wrong (assembly output)

尝试将其更改为-c使用

clang++ -std=c++20 a.pcm -c -o a.pcm.o # This is how you compile pcm-files to object files
于 2021-03-30T15:12:15.063 回答