我正在查看 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 后再次编译它吗?