编译问题:找不到crt1.o

时间:2011-06-13 11:35:20

标签: gcc clang ld

我有一个虚拟的Debian系统,我用它来开发。

今天我想尝试llvm / clang。

安装clang后我无法编译旧的c-projects(使用gcc)。 这是错误:

...
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: ld returned 1 exit status
...

我卸载了clang但它仍然无效。

有谁知道如何解决这个问题?

16 个答案:

答案 0 :(得分:71)

Debian / Ubuntu

问题是你可能只有当前架构的gcc而且是64位。您需要32位支持文件。为此,您需要安装它们

sudo apt install gcc-multilib

答案 1 :(得分:60)

帮助我的是创建一个符号链接:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

答案 2 :(得分:33)

看来,当你玩llvm / clang时,你(或包管理器)删除了以前现有的标准C库开发包(Debian上的eglibc),或者你可能没有在第一次安装它因此你需要重新安装它,现在你又回到了gcc。

你可以在Debian上这样做:

aptitude show libc-dev

Ubuntu的:

apt-get install libc-dev

在Ubuntu上,如果你没有libc-dev,因为我在packages.ubuntu.com上找不到它,你可以尝试直接安装libc6-dev。

或者在类似Redhat的系统上:

  

yum install glibc-devel

注意:虽然你在评论中简要回答过,但这里有一个答案,所以有一个记录,以防有人遇到这个,可能正在寻找答案,但不是在评论或评论不明确对他们来说足够了。

答案 3 :(得分:25)

这是在启动板中报告的BUG,但有一种解决方法:

运行此命令以查看这些文件的位置

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

然后将此路径添加到LIBRARY_PATH变量

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH

答案 4 :(得分:17)

如果您正在使用Debian的测试版本,称为'wheezy',那么您可能会被移动到multiarch。更多关于Debian的multiarch:http://wiki.debian.org/Multiarch

基本上,正在发生的事情是各种体系结构特定的库正在从文件系统中的传统位置移动到新的体系结构特定位置。这就是/usr/bin/ld混淆的原因。

您现在可以在/usr/lib64//usr/lib/i386-linux-gnu/找到crt1.o,您需要告诉您的工具链。这里有一些关于如何做到这一点的文件; http://wiki.debian.org/Multiarch/LibraryPathOverview

请注意,仅创建符号链接只会为您提供一个架构,而您实际上将禁用multiarch。虽然这可能是您想要的,但它可能不是最佳解决方案。

答案 5 :(得分:13)

在阅读了jeremiah发布的http://wiki.debian.org/Multiarch/LibraryPathOverview后,我发现gcc标志在没有符号链接的情况下有效:

gcc -B/usr/lib/x86_64-linux-gnu hello.c

因此,您只需将-B/usr/lib/x86_64-linux-gnu添加到Makefile中的CFLAGS变量即可。

答案 6 :(得分:5)

crti.o file missing中所述,最好使用“gcc -print-search-dirs”查找所有搜索路径。然后创建一个链接,如上面的解释“sudo ln -s”指向crt1.o

的位置

答案 7 :(得分:3)

./ configure --disable-multilib

适用于它

答案 8 :(得分:1)

进入CentOs 5.4。注意到lib64包含crt * .o文件,但lib没有。通过安装了i386位的yum安装了glibc-devel,这解决了我的问题。

答案 9 :(得分:0)

当我交叉编译i686-cm-linux-gcc时,即使我遇到了相同的编译错误。

以下编译选项解决了我的问题

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

注意: sysroot 应该指向usr / include available的编译器目录

在我的情况下,工具链安装在/ opt / toolchain / i686-cm-linux-gcc目录中,usr / include也可以在同一目录中使用

答案 10 :(得分:0)

我解决了它如下:

1)尝试使用find -name ctr1.o

找到ctr1.o和ctri.o文件

我的计算机中有以下内容:$/usr/lib/i386-linux/gnu

2)将该路径添加到PATH(也是LIBRARY_PATH)环境变量(为了查看终端中的名称:type env命令):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH

答案 11 :(得分:0)

这适用于Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH

答案 12 :(得分:0)

我今天遇到了同样的问题,我通过安装推荐的软件包解决了这个问题: libc6-dev-mipsel-cross libc6-dev-mipsel-cross,libc-dev-mipsel-cross

这有效:

sudo apt-get install libc6-dev-mipsel-cross

答案 13 :(得分:-1)

就我而言,来自Matlab的执行路径配置需要crti.o错误。 例如,如果您之前未设置执行目录的路径,则无法执行文件。 为此:文件> setPath,添加你的目录并保存。

答案 14 :(得分:-1)

使用gcc -B lib_path_containing_crt?.o

答案 15 :(得分:-2)

就我而言Ubuntu 16.04我根本没有crti.o

$ find /usr/ -name crti*

所以我安装了开发人员libc 6 -dev package:

sudo apt-get install libc6-dev