【问题标题】:Clang linker issues (from source, to gcc-snapshot)Clang 链接器问题(从源代码到 gcc-snapshot)
【发布时间】:2013-01-02 07:14:50
【问题描述】:

我似乎无法让它工作。我配置了--with-gcc-toolchain=,在equals之后我把gcc所在的目录(/usr/lib/gcc-snapshot/bin)。

我还查看了“clang linker problem”的答案,但我看不到如何获得接受的答案以找到正确的位置,并且符号链接答案会起作用,除了它所在的所有目录搜索存在(将lib 文件夹从 gcc-snapshot 复制到包含位置之一似乎没有帮助)。

正如另一个问题中所建议的,clang++ test.cpp -v 的输出:

bob@bob:~/programming$ clang++ test.cpp -v
clang 3.3 版(主干 171350)
目标:x86_64-unknown-linux-gnu
线程模型:posix
“/home/bob/programming/build/Release+Asserts/bin/clang” -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -main-file-name test.cpp -mrelocation-model 静态 -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-linker-version 2.22 -momit-leaf-frame-pointer - v -resource-dir /home/bob/programming/build/Release+Asserts/bin/../lib/clang/3.3 -fmodule-cache-path /var/tmp/clang-module-cache -internal-isystem /usr /local/include -internal-isystem /home/bob/programming/build/Release+Asserts/bin/../lib/clang/3.3/include -internal-externc-isystem /usr/include/x86_64-linux-gnu - internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /home/bob/programming -ferror-limit 19 -fmessage-length 80 -mstackrealign -fobjc-runtime= gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -backend-option -vectorize-loops -o /tmp/test-PWiB4M.o -x c++ t est.cpp
clang -cc1 版本 3.3 基于 LLVM 3.3svn 默认目标 x86_64-unknown-linux-gnu
忽略不存在的目录“/include”
#include "..." 搜索从这里开始:
#include <...> 搜索从这里开始:
/usr/local/include
/home/bob/programming/build/Release+Asserts/bin/../lib/clang/3.3/include
/usr/include/x86_64-linux-gnu
/usr/include
搜索列表结束。
test.cpp:1:10:致命错误:找不到“iostream”文件
#包括 ^
产生 1 个错误。

clang 3.3 版(主干修订版 171350)

编辑:Release+Asserts 文件夹中没有用于构建的 .o 文件。这是正常的吗?如果不是,为什么会出现这种情况,我该如何解决(如果我可以将它作为 clang 的 stdlib,那么它也可以)。

编辑2:它也无法编译int main(){return 0;},因为它找不到crtbegin.o。完整输出如下:

/usr/bin/ld: 找不到 crtbegin.o: 没有这样的文件或目录
/usr/bin/ld: 找不到 -lgcc
/usr/bin/ld: 找不到 -lgcc_s
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

-v之后的结果和上面一样,只是结束错误不同。

Config.log:
完整的文件可以在here找到,但第一行(非注释)是:$ ../llvm/configure --with-gcc-toolchain=/usr/lib/gcc-snapshot/gcc

【问题讨论】:

  • test.cpp 是否编译并与 g++ 链接?在您的输出中,代码无法编译,因为找不到 iostream。 -
  • @emil 这就是我的观点。我添加了另一个无法在编辑 2 中编译的示例。它使用 g++ 编译得很好
  • 你安装llvm的地方iostream文件在哪里(你的llvm前缀)
  • 在构建 gcc-snapshot 时,是否启用了 c++ 语言?
  • @Spundun 是的,c++ 与 g++ 配合得很好。在llvm目录下,我有iostream.cc,但是在build目录下,我什么都没有。

标签: clang ubuntu-12.04 dynamic-linking


【解决方案1】:

我们发现的问题是 gcc 是使用 --prefix=/usr/lib/gcc-snapshot 配置参数安装的。并且 llvm 配置了 --with-gcc-toolchain=/usr/lib/gcc-snapshot/gcc 参数。它应该与 gcc 安装前缀相同,即 --with-gcc-toolchain=/usr/lib/gcc-snapshot。

问题的当前第一行显示“我使用 --with-gcc-toolchain= 进行了配置,在等号之后我放置了 gcc 所在的目录 (/usr/lib/gcc-snapshot/bin)。”,并且当前最后一行说“第一(非注释)行是:$ ../llvm/configure --with-gcc-toolchain=/usr/lib/gcc-snapshot/gcc”

这令人费解,你可能以为你放了标志 --with-gcc-toolchain=/usr/lib/gcc-snapshot/bin 但实际上你放了 --with-gcc-toolchain=/usr/ lib/gcc-snapshot/gcc

无论如何,我认为您应该尝试以下方法。

  1. 删除或重命名构建目录(运行配置命令的目录,即找到 config.log 文件的目录)我假设它是 /home/bob/programming/build 目录。
  2. 现在再次创建 /home/bob/programming/build 目录。现在应该是空的。
  3. cd /home/bob/programming/build
  4. 运行以下配置命令 ../llvm/configure --with-gcc-toolchain=/usr/lib/gcc-snapshot
  5. 完成其余的构建过程。

问题似乎是您没有正确指定 gcc-toolchain 前缀。它应该与您在配置 gcc 时使用的 --prefix 参数相同。

在这里报告结果。

另见Clang 3.2 build broken after building gcc 4.7

【讨论】:

  • 是的,我在您发布评论时添加了该信息。
  • 可能还有其他事情发生,但是将错误的目录作为工具链参数肯定可以解释我们在这里看到的内容。这可能只是迈向最终成功的第一步。
  • 所以很清楚(很抱歉再次检查)它的--with-gcc-toolchain=/usr/lib/gcc-snapshot 不是:--with-gcc-toolchain=/usr/lib/gcc-snapshot/bin
  • 是的。 10 年的使用 autotools 和 4-6 年的工具链构建支持表明了这一点。不过,我不会赌上我的生命。 :) 所以让我们看看会发生什么。如果它不起作用,请回来报告。
  • 不幸的是,根据llvm.org/viewvc/llvm-project/llvm/trunk/… ,配置脚本只是将其作为 gcc 安装的前缀放在头文件中,而没有对其是否真的可以找到 gcc 进行任何健全性检查或 libgcc 在它期望的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
相关资源
最近更新 更多