gpt4 book ai didi

c++ - clang 编译的模块 pcm 文件有什么用?

转载 作者:行者123 更新时间:2023-12-03 17:09:21 27 4
gpt4 key购买 nike

我正在查看 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 文件的步骤。
来自司机 tests :
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)
注意:可以编译a-m.cc
clang++ std=c++20 -c a-m.cc -o a.o
并与 a.o 链接,但 .pcm.o 文件是做什么用的?并且它们可以用来避免在您预编译后再次编译 a-m.cc 吗?

最佳答案

pcm 文件包含有关模块的“半成品”信息。文件扩展名不必是 pcm,我认为 Visual Studio 例如使用 .ifc作为扩展。 (与 Visual Studio 的不同之处在于它同时输出 ifc 文件并编译目标文件( .obj ),而 clang 分两个单独的步骤执行此操作)
pcm 文件以某种格式存储有关模块文件的信息,以便编译器可以轻松地将其导入或编译为其他目标文件。
您链接中的命令让我感到惊讶,我认为 -S在示例中正在编译为汇编,所以我很惊讶它在您链接到的那个 clang repo 中列出。

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

关于c++ - clang 编译的模块 pcm 文件有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66611418/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com