在linux上链接clang/llvm库总是失败

linking against clang/llvm libraries on linux always fails

本文关键字:失败 llvm linux 链接 clang      更新时间:2023-10-16

我使用的是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库的未定义引用。我试过对此进行研究,发现这与在命令行上放置库标志的顺序有关。除此之外,我还尝试了其他一些东西:

  1. 我尝试了一堆编译器标志,改变了链接器标志的显示顺序,但它们始终不起作用
  2. 我下载并编译了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:)