Clang链接器问题(从源代码到gcc-snapshot)

5

我似乎无法让这个工作。我使用了--with-gcc-toolchain=参数,并在等号后面放置了gcc所在的目录(/usr/lib/gcc-snapshot/bin)。

我还查阅了“clang linker problem” 的答案,但我不知道如何获取接受的答案来找到正确的位置,而符号链接的答案本来可以起作用,但它正在搜索的所有目录都存在(将lib文件夹从gcc快照复制到其中一个包含位置似乎也没有帮助)。

如其他问题建议的,将clang++ test.cpp -v的输出:

bob@bob:~/programming$ clang++ test.cpp -v
clang version 3.3 (trunk 171350)
Target: x86_64-unknown-linux-gnu
Thread model: 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 static -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++ test.cpp
clang -cc1 version 3.3 based upon LLVM 3.3svn default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/home/bob/programming/build/Release+Asserts/bin/../lib/clang/3.3/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
test.cpp:1:10: fatal error: 'iostream' file not found
#include ^
1 error generated.

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:
完整文件可以在此处找到,但第一行(非注释)是:$ ../llvm/configure --with-gcc-toolchain=/usr/lib/gcc-snapshot/gcc


test.cpp 能否使用 g++ 进行编译和链接?根据你的输出,代码无法编译,因为找不到 iostream。 - emil
@emil 这就是我的观点。我在编辑2中添加了另一个无法编译的示例。使用g++编译没有问题。 - soandos
在您安装 LLVM(即 LLVM 前缀)的位置中,iostream 文件在哪里? - Spundun
@Spundun 是的,C++ 可以很好地与 g++ 配合使用。在 llvm 目录中,我有 iostream.cc 文件,但在构建目录中,我什么都没有。 - soandos
@Spundun 更新了,之前忘记了,抱歉(请注意,gcc-snapshot已安装到该位置)。 - soandos
显示剩余4条评论
1个回答

4
我们发现的问题是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. 删除或重命名构建目录(运行configure命令的目录,即找到config.log文件的目录),我假设它是/home/bob/programming/build目录。 2. 现在再次创建/home/bob/programming/build目录,现在它应该是空的。 3. cd /home/bob/programming/build 4. 运行以下configure命令 ../llvm/configure --with-gcc-toolchain=/usr/lib/gcc-snapshot 5. 继续进行余下的构建过程。
问题似乎在于你没有正确地指定gcc-toolchain前缀。它应该与你配置gcc时使用的--prefix参数相同。
请在此处报告结果。
另请参见Clang 3.2 build broken after building gcc 4.7

是的,当你发表评论时,我正在添加那些信息。 - Spundun
所以很明确(抱歉要再次确认),它是 --with-gcc-toolchain=/usr/lib/gcc-snapshot 而不是 --with-gcc-toolchain=/usr/lib/gcc-snapshot/bin - soandos
是的。使用autotools已有10年,工具链构建支持方面有4-6年的经验表明是这样的。不过,我并不会把生命压在这上面。 :) 所以让我们看看会发生什么。如果不行就回报告。 - Spundun
哦,顺便让我确认一下,您能否运行命令“/usr/lib/gcc-snapshot/bin/gcc -v”,并验证这是否是您认为已安装的gcc二进制文件的路径。希望您已经开始了新的构建。 - Spundun
啊,是的,我打错字了。我本来想说的是:“这很令人困惑,你可能认为已经设置了标志--with-gcc-toolchain=/usr/lib/gcc-snapshot/bin,但实际上你设置的是--with-gcc-toolchain=/usr/lib/gcc-snapshot/gcc”。请注意,我使用了过去式的put。 - Spundun
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接