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&lt;&gt;不在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 错误

iOS底层探索之LLVM——自定义Clang插件(上)

IOS逆向-LLVM代码混淆

matlab mex clang C++11线程->未定义符号错误

使用 clang 和插件编译

iOS学习使用 Xcode 开发 Clang 插件