使用 clang 和插件编译
Posted
技术标签:
【中文标题】使用 clang 和插件编译【英文标题】:compiling with clang and plugin 【发布时间】:2017-04-27 20:11:40 【问题描述】:clang
支持插件,这个概念通常用于构建静态分析等工具。
为了开始使用它,我使用了this example,它打印了目标 cpp 文件中存在的所有函数名称。
我编译了运行以下插件的插件:
clang++ -v -std=c++11 PrintFunctionNames.cpp \
$(llvm-config --cxxflags --ldflags) \
-o plugin.so -shared -Wl,-undefined,dynamic_lookup
然后“按本书”运行它:
clang++ \
-c main.cpp \
-Xclang -load \
-Xclang $PWD/plugin.so \
-Xclang -plugin \
-Xclang print-fns
它工作得很好:它打印 main.cpp 中的函数名然后退出(由于 -c 标志而不编译 main.cpp)。
我想做的是打印所有函数名并将 main.cpp 编译成可执行文件。
我尝试删除 -c
标志,但得到了:
/usr/bin/ld: cannot find /tmp/main-284664.o: No such file or directory
我做错了什么?
【问题讨论】:
【参考方案1】:你需要使用 -add-plugin 而不是 -plugin
【讨论】:
【参考方案2】:我一直认为运行两次clang
是“自然的”,但这是一个有效的问题。
我不认为你做错了什么,但我相信(没有过多挖掘clang
来源)正在发生的事情是所有Xclang
都被转发到cc1
part 的clang
创建临时文件以适应插件运行。但是,当链接器作为单独的进程被调用时,这些文件不再存在,因此出现错误。
您可以通过在所有这些命令上使用 -v
选项来查看所有内容。
我不确定这是否可能,但这个 SO thread 可能会提供正确方向的线索。
【讨论】:
“此 SO 线程”的链接已损坏。你还有机会吗? @mrks 链接已修复以上是关于使用 clang 和插件编译的主要内容,如果未能解决你的问题,请参考以下文章
clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS