编译问题:找不到crt1.o


114

我有一个用于开发的虚拟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,但仍然无法正常工作。

有谁知道我该如何解决?


6
尝试安装libc0.1-dev
Michas 2011年



这是在启动板中报告的错误,但没有解决方法:askubuntu.com/questions/251978/…–
Roman

Answers:



62

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

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

5
确实可以,但是实际上,它只为您提供了Debian多体系结构上的一个体系结构。
jeremiah 2012年

2
尝试设置某人作为tar软件包给我的交叉编译工具链时,我遇到了同样的问题。我不得不使用strace(即“ strace gcc <所有参数> 2>&1 | grep crt1.o”)来查看gcc在哪里寻找crt1.o,因此我可以弄清楚要创建的符号链接。
安德鲁·班布里奇

37

似乎在使用llvm / clang时,您(或程序包管理器)删除了以前存在的标准C库开发程序包(eglibc Debian上的),或者也许您没有首先安装它,因此您需要重新安装现在,您已还原回gcc。

您可以在Debian上这样做:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

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

或在类似Redhat的系统上:

百胜安装glibc-devel

注意:尽管您在评论中得到了简短的回答,但这里只是一个答案,以防万一有人遇到这个问题并正在寻找答案的情况下,有一个记录在案,但是评论中没有,或者评论对他们而言不够明确。


1
并不是说debian的多体系结构破坏了很多构建,经常会出现此错误。导出LD_LIBRARY_PATH可以解决问题。
deadalnix

3
这有助于为高山的Linuxapk add libc-dev=0.7.1-r0
宇夹袄

27

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

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

$ 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。如果您不想
破坏

17

如果您使用的是Debian的“测试版”,称为“ wheezy”,那么您可能已经对迁移到multiarch感到痛苦。有关Debian多体系结构的更多信息,请访问:http ://wiki.debian.org/Multiarch

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

您现在都可以在两者中找到crt1.o,/usr/lib64/并且/usr/lib/i386-linux-gnu/需要告诉您的工具链。这是一些有关如何执行此操作的文档;http://wiki.debian.org/Multiarch/LibraryPathOverview

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


3
多一些有关如何“告诉您的工具链”的知识,这真是太棒了,因为我正是这种情况。谢谢。
SullX

首先,您需要知道要建立哪种架构。您要构建基于AMD64的应用程序吗?如果是这样,则需要告诉'ld'基于AMD64的共享对象文件在哪里,即所需的.o文件。如果您使用的是AMD64,则它们应位于/ usr / lib64中
jeremiah 2013年


9

要使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标志编译程序

    gcc pgm.c -m32 -o pgm

从这里偷来的:如何在64位RHEL上编译32位应用程序?-我只需要执行步骤1。





1

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


0

即使我交叉编译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也位于同一目录中


0

我解决了如下问题:

1)尝试通过使用找到ctr1.o和ctri.o文件 find -name ctr1.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行实际上是:
pac88

0

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

这工作:

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

-1

在我的情况下,crti.o错误是由Matlab的执行路径配置引起的。例如,如果您之前未设置执行目录的路径,则无法执行文件。为此,请执行以下操作:File> setPath,添加目录并保存。



-2

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

$ find /usr/ -name crti*

因此,我安装了开发人员libc 6 -dev软件包:

sudo apt-get install libc6-dev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.