在linux上链接clang/llvm库总是失败
linking against clang/llvm libraries on linux always fails
我使用的是Linux Mint 15 Olivia,我安装了存储库中可用的clang编译器和libclang dev包,它们是3.2版。
我正在尝试编译并链接clang存储库中的示例http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_32/final/examples/clang-interpreter/main.cpp正如您所看到的,它来自clang 3.2版本。
当我用命令编译它时:
$> clang++ `llvm-config --cflags` -c main.cpp
我得到了文件main.o,其中包含一些未定义的clang/llvm库符号。我通过使用nm命令确保它包含符号:
$> nm main.o
叮当的一个符号是
_ZN5clang16CompilerInstanceC1Ev
直到现在,一切都很好,直到我尝试将"main.o"文件与clang/llvm库链接起来。当我发出命令时:
$> clang++ `llvm-config --ldflags` main.o `llvm-config --libs`
它失败了,输出如下(我只是把第一个错误放在这里,以免混淆这篇文章):
main.o: In function `main':
main.cpp:74: undefined reference to `clang::TextDiagnosticPrinter::TextDiagnosticPrinter(llvm::raw_ostream&, clang::DiagnosticOptions*, bool)'
基本上,我得到了一大堆对clang库的未定义引用。我试过对此进行研究,发现这与在命令行上放置库标志的顺序有关。除此之外,我还尝试了其他一些东西:
- 我尝试了一堆编译器标志,改变了链接器标志的显示顺序,但它们始终不起作用
- 我下载并编译了LLVM和clang源代码3.2和3.4版本,结果相同:编译成功,链接失败。值得一提的是,对于每个版本,重新排序链接器标志总是会给出不同的链接错误(这当然是由于链接搜索库的方式)
我没有什么想法了,已经花了2个小时试图从clang的存储库中编译一个简单的例子,如果有任何帮助,我将不胜感激。
谢谢
答案很简单-llvm配置不会给你clang库。您需要分别将它们链接起来。检查clang/tools/driver/Makefile作为库列表的一个示例。
正如Anton Korobeynik所建议的,这个问题的答案是,我缺少clang库(它们不是llvm构建的一部分,正如我从命令"llvm config--libs"中所期望的那样)。
最后的命令是:
clang++ `llvm-config --ldflags` main.o -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangAnalysis -lclangARCMigrate -lclangRewriteFrontend -lclangRewriteCore -lclangEdit -lclangAST -lclangLex -lclangBasic `llvm-config --libs`
如果编译任何clang工具或示例,请确保检查clang/tools文件夹下的Makefiles:)
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- LLVM GetAnalysis() 失败,需要通过
- LLVM-5.0 MakeFile未定义的参考失败
- 在linux上链接clang/llvm库总是失败
- 从OSX平台转换并使用gcc和llvm时生成失败
- 对于具有不同位数的类型,LLVM 类型转换失败
- 使用g++与clang / LLVM链接失败