clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS
Posted
技术标签:
【中文标题】clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginASTAction> >【英文标题】:clang plugin compilation error: undefined symbols llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginASTAction> > 【发布时间】:2014-11-14 00:41:46 【问题描述】:我正在尝试构建llvm clang samples。
除了plugin_print_funcnames.cpp
插件编译外,一切正常。代码在这里找到:plugin_print_funcnames.cpp
似乎clang++找不到库llvm:Registry<>
不在llvm库中。
我使用 brew 中的 llvm/clang 和命令 brew install llvm
。
可能出了什么问题?
这是一个命令行:
g++ -fpic -fno-rtti -O0 -g `/usr/local/Cellar/llvm/HEAD/bin/llvm-config --cxxflags` -I$HOME/llvm/from_git/llvm/tools/clang/include -I/usr/local/Cellar/llvm/HEAD/tools/clang/include src_clang/plugin_print_funcnames.cpp \
-shared `/usr/local/Cellar/llvm/HEAD/bin/llvm-config --ldflags --libs --system-libs` -o build/plugin_print_funcnames.so
这些是错误消息的一部分:
Undefined symbols for architecture x86_64:
"llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginASTAction> >::ListenerHead", referenced from:
__GLOBAL__I_a in plugin_print_funcnames-342dff.o
"llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginASTAction> >::Head", referenced from:
【问题讨论】:
【参考方案1】:我敢肯定你早就不需要这个了,但我遇到了类似的问题。这是您的具体问题的答案以及我用来找出答案的命令。进入 llvm/clang lib 目录并输入:
$ nm -o *.a |grep Registry |grep PluginASTAction |cut -d ':' -f 1 |uniq
libclangFrontend.a
libclangFrontendTool.a
nm
的 -o
标志非常重要,因为它告诉 nm 在每一行打印文件名,因此当 grep 找到匹配项时,您有上下文。
使用答案中的技术找到相应的库后,将其添加到链接行。然后,如果您遇到另一个链接器错误,请重复该过程。最终,最后一个消失了。例如,在上述情况下,您将添加 -lclangFrontend -lclangFrontendTool。
对我来说,我必须像这样找到大约 10 个不同的库。
我相信我必须添加的内容列表是:-lclangSerialization -lclangASTMatchers -lclangSema -lclangAnalysis -lclangRewriteFrontend -lclangEdit -lclangParse -lclangFrontend -lclangBasic -lclangDriver -lclangAST -lclangLex
,但这是在运行 llvm/bin/llvm-config --ldflags --libs --system-libs
的内容之外的。在撰写本文时,这是在最新的 OS X 上。
【讨论】:
能否详细说明如何删除错误信息?以上是关于clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS的主要内容,如果未能解决你的问题,请参考以下文章
gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误