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

时间:2014-02-11 04:10:30

标签: c++ clang llvm linker-errors clang++

我正在使用Linux Mint 15 Olivia,我安装了存储库中提供的clang编译器和libclang-dev软件包,它们是版本3.2。

我正在尝试编译并链接clang repository 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

来自clang的符号将是

_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,结果相同:编译工作,链接失败。值得一提的是,对于每个版本重新排序链接器标志总是会产生不同的链接错误(这当然是由于链接搜索库的方式)。
  3. 我没有想法,已经花了2个小时尝试从clang的存储库编译一个简单的例子,任何帮助都将不胜感激。

    谢谢

2 个答案:

答案 0 :(得分:2)

答案很简单 - llvm-config不会给你clang库。您需要单独链接它们。检查clang / tools / driver / Makefile作为库列表的示例。

答案 1 :(得分:2)

这个问题的答案就像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文件夹下的Makefile:)