如何修复链接器错误“无法找到 crt1.o”?

我有一个虚拟 Debian 系统,我用它来开发。今天我想试试 lvm/clang。在安装 clang 之后,我无法编译我的旧 c-project (使用 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

我卸载的叮当声,它仍然不工作。有人知道我该如何解决这个问题吗?

316722 次浏览

似乎当你在使用 llvm/clang 的时候,你(或者包管理器)删除了之前存在的标准 C 库开发包(Debian 上的 翻译) ,或者你一开始没有安装它,所以你需要重新安装它,现在你又回到了 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

注意: 虽然你在评论中得到了简短的回答,但是这里有一个答案,以防有人遇到这个问题并且可能正在寻找答案,但是没有在评论中,或者评论对他们来说不够明确。

帮助我的是创建一个象征性的链接:

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

如果您正在使用 Debian 的测试版本,称为“ wheezy”,那么您可能已经被转移到 multiarch 咬了一口。更多关于 Debian 的多元统治者: http://wiki.debian.org/Multiarch

基本上,正在发生的是各种特定于体系结构的库正在从文件系统中的传统位置迁移到新的特定于体系结构的位置。这就是 /usr/bin/ld感到困惑的原因。

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

请注意,仅仅创建一个符号链接只会给您提供 体系结构,并且实质上将禁用 multiarch。虽然这可能是你想要的,但它可能不是最佳解决方案。

在读了 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 变量中。

正如在 Crti.o 文件丢失中所解释的,最好使用“ gcc-print-search-dirs”来查找所有的搜索路径。然后按照上面“ sudo ln-s”的解释创建一个链接,指向 crt1.o 的位置

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

在我的示例中,由于 Matlab 的执行路径配置,出现了 crti.o 错误。 例如,如果之前没有设置执行目录的路径,则无法执行文件。 为此: File > setPath,添加目录并保存。

Debian/Ubuntu

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

sudo apt install gcc-multilib

这是在 launchpad 中报告的 臭虫,但是有一个变通方法:

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

$ 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

使用 gcc -B lib_path_containing_crt?.o

甚至我在交叉编译 i686-cm-linux-gcc 时也得到了相同的编译错误。

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

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

注意: Sysroot应该指向可用 usr/include 的编译器目录

在我的示例中,工具链安装在/opt/toolchain/i686-cm-linux-gcc 目录中,并且在同一目录中还可以使用 usr/include

我解决了这个问题:

1)尝试使用 find -name ctr1.o定位 ctr1.o 和 ctri.o 文件

我的电脑里有以下内容: $/usr/lib/i386-linux/gnu

2)将该路径添加到 PATH(也是 LIBRARY_PATH)环境变量(以便查看名称: 在终端中键入 env命令) :

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

要让 RHEL 764位编译 gcc 4.832位程序,您需要做两件事。

  1. 确保完全安装了所有32位 gcc 4.8开发工具:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  2. Compile programs using the -m32 flag

    gcc pgm.c -m32 -o pgm
    

stolen from here : How to Compile 32-bit Apps on 64-bit RHEL? - I only had to do step 1.

在我的情况下,我根本没有 crti.o:

$ find /usr/ -name crti*

因此,我安装了开发人员 libc6-dev 包:

sudo apt-get install libc6-dev

这对我的 Ubuntu 16.04很管用

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

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

这个方法奏效了:

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

./configure —— able-multilib

很有效

一个神奇的命令:

sudo apt install build-essential

修正了我的一切,甚至树莓派。

在 Alpine Linux 上,这意味着你 需要 musl-dev:

apk add musl-dev

虽然我的信息是:

/usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find Scrt1.o: No such file or directory
/usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find crti.o: No such file or directory
/usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lssp_nonshared: No such file or directory
collect2: error: ld returned 1 exit status

也是由于缺少 musl-dev造成的。