我正在尝试构建 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:
最佳答案
我确信您早就不需要这个了,但我遇到了类似的问题。这是您的具体问题的答案以及我用来找出答案的命令。进入 llvm/clang lib 目录并输入:
$ nm -o *.a |grep Registry |grep PluginASTAction |cut -d ':' -f 1 |uniq
libclangFrontend.a
libclangFrontendTool.a
-o
标记为nm
非常重要,因为它告诉 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。
关于macos - clang 插件编译错误: undefined symbol llvm::Registry<clang::PluginASTAction,llvm::RegistryTraits<clang::PluginASTAction>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921130/