【问题标题】:linking against clang/llvm libraries on linux always fails在 linux 上链接 clang/llvm 库总是失败
【发布时间】:2014-03-08 17:06:11
【问题描述】:

我使用的是 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

来自 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,结果相同:编译成功,链接失败。值得一提的是,对于每个版本,重新排序链接器标志总是给出不同的链接错误(这当然是由于链接搜索库的方式)。

我的想法已经用完了,并且已经花了 2 个小时尝试从 clang 的存储库中编译一个简单的示例,我们将不胜感激。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,我一拿到我的开发电脑就会尝试一下
    • 那天晚上我确实累了,瞎了眼....我以那个 Makefile 为例,还使用了标志的顺序,因为 clang 依赖于 llvm,现在它可以编译了 :) 谢谢!
    【解决方案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 :)

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2022-01-22
      • 2014-09-27
      • 2019-05-06
      • 2017-05-29
      相关资源
      最近更新 更多