Clang 工具在使用 -Xclang

问题描述 投票:0回答:1

我创建了一个基本的 clang 工具并使用 FrontendPluginRegistry 注册它:

static FrontendPluginRegistry::Add<MyActionClass>
    X("my-parser", "my-clang-tool-parser")

我能够使用 -cc1 选项在源文件上成功运行此工具:

clang -cc1 -load my-tool.so -plugin my-parser source_file.cpp

上述命令给出了预期的正确结果,没有任何问题。然后我使用以下命令使用 Xclang 选项运行该工具:

clang -Xclang -load -Xclang my-tool.so -Xclang -plugin -Xclang my-parser source_file.cpp

在这种情况下,首先我得到所有正确的输出行(与 cc1 选项相同),但在输出之后,我得到 2 条额外的行:

/tmp/test1-856817.o file not recognized: File truncated
clang:error linker command failed with exit code 1 (use -v to see invocation)

虽然我的工具是一个巨大项目的一部分,但我猜测代码是正确的,因为它能够成功构建,并且在通过 cc1 和 Xclang 选项运行时也给出正确的输出。只是在 Xclang 的情况下输出后额外的 2 行我无法理解。

我尝试使用 Xclang 运行该工具,因为我想传递 -I 选项来包含 source_file.cpp 中的一些头文件,并且 clang 文档不鼓励在这种情况下使用 cc1。

据我所知,该工具在这两种情况下应该给出相同的输出。

c++ clang llvm clang++
1个回答
0
投票

TL;DR:不使用

-cc1
时只需通过
-fsyntax-only

但是为什么呢?

-cc1
是一个very特殊的标志。为了理解,我们需要看看编译器 clang 正在模仿,
gcc
。当您运行 gcc 时,它不仅仅执行编译,它还可以执行包括编译在内的许多任务。如果你运行“gcc foo.c -c -o foo.o”,那么它会编译,是的,但你也可以运行“gcc foo.c math.f -o程序”,然后它编译你的C,运行
gfortran
要编译 Fortran,请运行
collect2
,它运行
ld
将两个生成的
.o
文件链接到单个可执行文件中。如果您运行
gcc foo.c
那么它会尝试将其链接到名为
a.out
的程序。我们将最外层的 gcc 称为“驱动程序”,因为它所做的只是运行其他程序。该程序是 GNU 编译器集合的一部分,实际上编译 C 代码,称为
cc1

Clang 遵循 gcc 的设计。

clang
是一个可以分叉并运行多个程序的驱动程序。但是,没有
clang-cc1
等效项,而是再次为
clang
二进制,但第一个标志是
-cc1
标志。请注意,这意味着 clang 的行为就好像它是一个完全不同的二进制文件,具有完全不同的支持标志(并且与我可能添加的
gcc -cc1
标志不兼容)。
-Xclang
的目的是告诉 clang 驱动程序请将以下标志传递给
clang -cc1
调用,而不是将其解析为 clang 驱动程序的标志。这在本质上与
-Wl,-linker-flag-here
-Wa,-assembler-flag-here
类似。

可以通过

-fsyntax-only
告诉司机不要组装或链接。如果您想调试驱动程序,您可以要求它转储它将运行的内容,并将
-###
作为您的第一个标志。

© www.soinside.com 2019 - 2024. All rights reserved.