【问题标题】:Compiling problems: cannot find crt1.o编译问题:找不到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,还是不行。

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

【问题讨论】:

标签: gcc clang ld


【解决方案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
      

      【讨论】:

      【解决方案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 位程序,您需要做两件事。

              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
                

              从这里被盗: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
                        猜你喜欢
                        • 2011-12-17
                        • 1970-01-01
                        • 2014-03-10
                        • 1970-01-01
                        • 2017-10-23
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-03-07
                        • 2021-12-31
                        相关资源
                        最近更新 更多