编译问题:找不到crt1.o

Posted

技术标签:

【中文标题】编译问题:找不到crt1.o【英文标题】:Compiling problems: cannot find crt1.o 【发布时间】:2011-09-13 20:47:12 【问题描述】:

我有一个用于开发的虚拟 Debian 系统。

今天想试试 llvm/clang。

安装 clang 后,我无法编译旧的 c 项目(使用 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,还是不行。

有人知道我该如何解决这个问题吗?

【问题讨论】:

尝试安装libc0.1-dev 对于 Mac,请参阅:***.com/questions/1365211/… Missing crt1 and crti when crosscompiling的可能重复 这是一个在启动板中报告的错误,但有一个解决方法:askubuntu.com/questions/251978/… 【参考方案1】:

一个神奇的命令:

sudo apt install build-essential

即使在 Raspberry Pi 上也为我修复了所有问题。

【讨论】:

【参考方案2】:

使用gcc -B lib_path_containing_crt?.o

【讨论】:

【参考方案3】:

Debian / Ubuntu

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

sudo apt install gcc-multilib

【讨论】:

在 Ubuntu 上这工作 sudo apt-get install gcc-multilib 并修复了我的错误来自 gfortran -m32 ... 提到 64 与 32 原因的更具体问题:***.com/questions/21724540/…【参考方案4】:

./configure --disable-multilib

为它工作

【讨论】:

【参考方案5】:

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

这行得通:

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

【讨论】:

【参考方案6】:

这对我来说适用于 Ubuntu 16.04

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

【讨论】:

【参考方案7】:

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

$ find /usr/ -name crti*

所以我安装了开发者 libc6-dev 包:

sudo apt-get install libc6-dev

【讨论】:

【参考方案8】:

要让 RHEL 7 64 位编译 gcc 4.8 32 位程序,您需要做两件事。

    确保所有 32 位 gcc 4.8 开发工具都已完全安装:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    

    使用 -m32 标志编译程序

    gcc pgm.c -m32 -o pgm
    

从这里被盗:How to Compile 32-bit Apps on 64-bit RHEL? - 我只需要执行第 1 步。

【讨论】:

【参考方案9】:

我是这样解决的:

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

【讨论】:

为了避免混淆,$PATH=/usr/lib/i386-linux/gnu:$PATH $export PATH 这行真的是:【参考方案10】:

我在交叉编译 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 也可以在同一目录中使用

【讨论】:

【参考方案11】:

这是启动板中报告的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。如果您不想破坏系统的库,这是首选路线【参考方案12】:

就我而言,crti.o 错误是由 Matlab 的执行路径配置引起的。 例如,如果您之前没有设置执行目录的路径,您将无法执行文件。 为此:File > setPath,添加您的目录并保存。

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

正如crti.o file missing 中解释的那样,最好使用“gcc -print-search-dirs”来找出所有搜索路径。然后按照上面的说明创建一个链接“sudo ln -s”以指向 crt1.o 的位置

【讨论】:

【参考方案15】:

在阅读了 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 变量即可。

【讨论】:

@DjDac 你在 Ubuntu 16.04 中不需要任何标志,AFAICT。【参考方案16】:

如果您使用的是 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

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

【讨论】:

关于如何“告诉你的工具链”的更多信息会很棒,因为这正是我所处的情况。谢谢。 首先,您需要知道要构建的架构。您正在构建基于 AMD64 的应用程序吗?如果是这样,您需要告诉 'ld' 基于 AMD64 的共享对象文件在哪里,即您需要的 .o 文件。如果您正在使用 AMD64,它们应该在 /usr/lib64【参考方案17】:

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

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

【讨论】:

这确实有效,但它实际上只为您提供了 Debian multiarch 上的一个拱门。 我在尝试设置一个交叉编译工具链时遇到了同样的问题,这个工具链有人给了我一个 tar 包。我必须使用 strace(即“strace gcc 2>&1 | grep crt1.o”)来查看 gcc 在哪里寻找 crt1.o,所以我可以弄清楚要创建什么符号链接。【参考方案18】:

似乎当你在玩 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 安装 glibc-devel

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

【讨论】:

并不是说 debian 的 multiarch 东西会破坏很多构建,通常会出现这个错误。 export LD_LIBRARY_PATH 可以解决问题。 这有助于 alpine linux apk add libc-dev=0.7.1-r0

以上是关于编译问题:找不到crt1.o的主要内容,如果未能解决你的问题,请参考以下文章

交叉编译遇到bin/ld: cannot find crt1.o: No such file or directory问题解决

编译链接实战(12)crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o是什么东西

在跨平台的基础上定位crti

AndroidStudio 很多类红色高亮找不到,可以编译运行

编译器找不到 .lib 文件

autotools,如果找不到交叉编译器,如何失败