编译问题:找不到crt1.o

Ste*_*ler 106 gcc clang ld

我有一个虚拟的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
...
Run Code Online (Sandbox Code Playgroud)

我卸载了clang,它仍然无法正常工作.

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

Dmi*_*nko 81

Debian/Ubuntu

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

sudo apt install gcc-multilib
Run Code Online (Sandbox Code Playgroud)

  • 我需要这个`gcc -m32 test.c`才能在wheezy 64bit上运行 (4认同)
  • 在Ubuntu这个工作`sudo apt-get install gcc-multilib`它修复了我的错误`gfortran -m32 ... (2认同)
  • 提到 64 与 32 原因的更具体问题:http://stackoverflow.com/questions/21724540/while-building-32-bit-executable-file-in-64-bit-linux-i-get-crt1-o-没有这样的文件 (2认同)

小智 62

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

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Run Code Online (Sandbox Code Playgroud)

  • 这确实有效,但它可以在Debian multiarch上有效地提供一个拱门. (5认同)
  • 我有同样的问题试图设置一个交叉编译工具链,有人给我作为tar包.我不得不使用strace(即"strace gcc <所有我的参数> 2>&1 | grep crt1.o")来查看gcc在哪里寻找crt1.o,所以我可以找出要创建的符号链接. (2认同)

Shi*_*nok 35

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

你可以在Debian上这样做:

aptitude show libc-dev
Run Code Online (Sandbox Code Playgroud)

Ubuntu的:

apt-get install libc-dev
Run Code Online (Sandbox Code Playgroud)

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

或者在Redhat之类的系统上:

yum安装glibc-devel

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

  • 这有帮助,对于高山Linux`apk add libc-dev = 0.7.1-r0` (2认同)

Uma*_*r R 26

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

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

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o
Run Code Online (Sandbox Code Playgroud)

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

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)


jer*_*iah 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.虽然这可能是您想要的,但它可能不是最佳解决方案.

  • 关于如何"告诉你的工具链"的更多内容将是非常棒的,因为这正是我所处的情况.谢谢. (3认同)

ale*_*exm 15

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

gcc -B/usr/lib/x86_64-linux-gnu hello.c
Run Code Online (Sandbox Code Playgroud)

因此,您只需-B/usr/lib/x86_64-linux-gnu在Makefile中添加CFLAGS变量即可.


bul*_*ous 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用-m32标志编译程序

    gcc pgm.c -m32 -o pgm
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 6

正如crti.o文件中所解释的那样,最好使用"gcc -print-search-dirs"查找所有搜索路径.然后创建一个链接,如上面的解释"sudo ln -s"指向crt1.o的位置


Nik*_*ntz 5

这对我的 Ubuntu 16.04 有用

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)