如何解决链接器错误 "cannot find crt1.o"?

178

我有一个用来进行开发的 Debian 虚拟系统。今天我想尝试 llvm/clang。安装 clang 后,我无法使用 gcc 编译我的旧 c 项目。

这是错误信息:

/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,但仍然无法工作。是否有人有任何想法如何解决这个问题?


7
尝试安装libc0.1-dev - Michas
1
对于Mac,请参见:https://dev59.com/6nM_5IYBdhLWcg3wdy_z#16102800 - kenorb
可能是Missing crt1 and crti when crosscompiling的重复问题。 - user2284570
这是在Launchpad上报告的一个BUG,但有一个解决方法: http://askubuntu.com/questions/251978/cannot-find-crti-o-no-such-file-or-directory - Roman
21个回答

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

Debian / Ubuntu

sudo apt install gcc-multilib

阿尔卑斯

apk add musl-dev

5
在Ubuntu上,这个命令 sudo apt-get install gcc-multilib 可以解决由于 gfortran -m32 ... 导致的错误。 - randwa1k
2
更具体的问题,提到了64位与32位的原因:http://stackoverflow.com/questions/21724540/while-building-32-bit-executable-file-in-64-bit-linux-i-get-crt1-o-no-such-file - Ciro Santilli OurBigBook.com
1
在 Fedora 上,这个命令可以解决问题:sudo dnf install glibc-devel.i686 - LeoDog896
2023年,这个答案仍然有效。 - papar

65

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

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

5
这确实可行,但在 Debian 多架构系统上,它只会给您提供一个有效的架构。 - jeremiah
3
我有同样的问题,试图设置一个别人给我打包成tar文件的交叉编译工具链。我不得不使用strace命令(例如 "strace gcc <所有参数> 2>&1 | grep crt1.o")来查看gcc正在寻找crt1.o的位置,以便我可以弄清楚要创建哪个符号链接。 - Andrew Bainbridge

55

看起来你在使用 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

注意:尽管您在评论中得到了简短的答案,但是这里提供一个回答记录下来,以防某人遇到此问题并可能正在寻找答案,但评论不够明确。


1
并不是说Debian的多架构系统会破坏很多构建,通常会出现这个错误。导出LD_LIBRARY_PATH可以解决问题。 - deadalnix
8
这有助于 Alpine Linux:apk add libc-dev=0.7.1-r0 - Yu Jiaao
对于Photon OS,tdnf install glibc-devel 对我有效。这也可能适用于CBL Mariner。 - CNad

35

这是一个在launchpad上报告的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

适用于14.04版本。如果您不希望搞乱系统库,这是首选路线。 - BobTuckerman
对我有用。我在我的Alpine镜像上遇到了这个问题,因为它包含了musl-gcc和本地gcc,路径都混乱了,所以我不得不将musl-gcc添加到我的lib路径中。谢谢! - Magmus

18

在阅读了Jeremiah发布的http://wiki.debian.org/Multiarch/LibraryPathOverview后,我发现了一个可以在没有符号链接的情况下运行的gcc标志。

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

因此,您可以在Makefile中的CFLAGS变量中添加-B/usr/lib/x86_64-linux-gnu


@DjDac,据我所知,在Ubuntu 16.04中你不需要任何标志。 - alexm

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。尽管这可能是您想要的,但它可能不是最佳解决方案。


4
如果您能详细说明如何“告诉您的工具链”,那将非常棒,因为我正处于这种情况中。谢谢。 - SullX
首先,您需要知道您正在构建哪种架构。您是否正在构建基于AMD64的应用程序?如果是这样,您需要告诉“ld” AMD64基础共享对象文件的位置,即您所需的“.o”文件。如果您正在使用AMD64,则它们应该位于/usr/lib64中。 - jeremiah

15
为了让RHEL 7 64位编译gcc 4.8 32位程序,您需要做两件事情。
  1. 确保所有32位gcc 4.8开发工具已完全安装:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  2. 使用-m32标志编译程序

  3. gcc pgm.c -m32 -o pgm
    

从这里盗取: 如何在64位RHEL上编译32位应用程序? - 我只需要完成第一步。


8

crti.o文件丢失所述,最好使用"gcc -print-search-dirs"查找所有搜索路径。然后创建一个链接,如上所述的"sudo ln -s"来指向crt1.o的位置。


7

这对我在Ubuntu 16.04上的使用起作用了。

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

3
在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 引起的。

在尝试在Alpine中构建httpbox时,对我很有效。 - Akito

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