使用 clang 和插件编译

Ste*_*ini 5 c++ plugins llvm clang

clang支持插件,这个概念通常用于构建静态分析等工具。为了开始使用它,我举了这个例子,它打印目标 cpp 文件中存在的所有函数名称。
我编译了运行以下命令的插件:

clang++ -v -std=c++11 PrintFunctionNames.cpp \
 $(llvm-config --cxxflags --ldflags) \
 -o plugin.so -shared -Wl,-undefined,dynamic_lookup
Run Code Online (Sandbox Code Playgroud)

然后“按书本”运行:

clang++ \
 -c main.cpp \
 -Xclang -load \
 -Xclang $PWD/plugin.so \
 -Xclang -plugin \
 -Xclang print-fns
Run Code Online (Sandbox Code Playgroud)

它工作得很好:它打印 main.cpp 中的函数名称
并退出(由于 -c 标志而无需编译 main.cpp)。

What I'd like to do is to print all the function names AND compile main.cpp into an executable.
I tried removing the -c flag but I got:

/usr/bin/ld: cannot find /tmp/main-284664.o: No such file or directory
Run Code Online (Sandbox Code Playgroud)

What am I doing wrong?

小智 5

您需要使用 -add-plugin 而不是 -plugin


com*_*por 3

我一直认为跑clang两次是“自然的”,但这是一个有效的问题。

我不认为你做错了什么,但我相信(没有深入clang研究源代码)正在发生的事情是所有内容都被Xclang转发到创建临时文件以适应插件运行的cc1 部分。clang但是,当链接器作为单独的进程调用时,这些文件不再存在,因此会出现错误。
您可以通过-v在所有这些命令上使用选项来查看所有内容。

我不确定这是否可能,但这个 SO线程可能会提供正确方向的线索。