编译问题:找不到crt1.o
我有一个虚拟的Debian系统,我用它来开发。
今天我想试试llvm / 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 ...
我卸载铛,它仍然没有工作。
有没有人有任何想法我可以解决这个问题?
帮助我的是创build一个符号链接:
sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
为了我
aptitude install gcc-multilib
在Debian上解决了类似的问题。
看起来你在玩llvm / clang的时候,你(或者软件包pipe理器)删除了以前存在的标准C库开发包( 例如 Debian上的libib ),或者你没有安装它,所以你需要重新安装现在你已经恢复到了gcc。
你可以在Debian上这样做:
aptitude show libc-dev
Ubuntu的:
apt-get install libc-dev
在Ubuntu上,如果你没有libc-dev,因为在packages.ubuntu.com上找不到它,你可以直接尝试安装libc6-dev。
或者在像Redhat这样的系统上:
yum安装glibc-devel
注意:尽pipe你在评论中简要地回答了,但是这里有一个答案,以防有人遇到这个答案,而且可能正在寻找答案,但不是在评论中,或者评论对他们来说不够明确。
这是启动板中报告的BUG ,但有一个解决方法:
运行这个来查看这些文件的位置
$ find /usr/ -name crti* /usr/lib/x86_64-linux-gnu/crti.o
然后将此path添加到LIBRARY_PATHvariables
$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
如果您使用的是Debian的testing版本,名为“wheezy”,那么您可能已经被多元化的攻击所困扰了。 关于Debian的多元化的更多信息请见http://wiki.debian.org/Multiarch
基本上,正在发生的事情是各种架构特定的库正在从文件系统中的传统位置移动到新的架构特定位置。 这就是为什么/usr/bin/ld
很困惑。
你会在/usr/lib64/
和/usr/lib/i386-linux-gnu/
现在findcrt1.o,你需要告诉你的工具链。 这里是一些文件如何做到这一点; http://wiki.debian.org/Multiarch/LibraryPathOverview
请注意,只是创build一个符号链接将只会给你一个架构,你会基本上禁用多元化。 虽然这可能是你想要的,但可能不是最佳解决scheme。
在阅读jeremiah发布的http://wiki.debian.org/Multiarch/LibraryPathOverview之后,我发现没有符号链接的gcc标志:;
gcc -B/usr/lib/x86_64-linux-gnu hello.c
所以,你可以在Makefile的CFLAGSvariables中添加-B/usr/lib/x86_64-linux-gnu
。
正如在crti.o文件中所解释的那样,最好使用“gcc -print-search-dirs”来找出所有的searchpath。 然后创build一个链接作为上面的解释“sudo ln -s”指向crt1.o的位置
为了让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
如何在64位RHEL上编译32位应用程序? – 我只需要做第一步。
在CentOs 5.4上运行。 注意到lib64包含crt * .o文件,但是lib没有。 通过安装了i386位的yum安装了glibc-devel,这解决了我的问题。
即使我在交叉编译i686-cm-linux-gcc时也遇到了相同的编译错误。
下面的编译选项解决了我的问题
$ i686-cm-linux-gcc ac --sysroot=/opt/toolchain/i686-cm-linux-gcc
注意: sysroot应该指向usr / include可用的编译器目录
在我的情况下,工具链安装在/ opt / toolchain / i686-cm-linux-gcc目录下,usr / include也可以在同一个目录下
这对Ubuntu 16.04工作
$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu $ export LIBRARY_PATH
我今天遇到了同样的问题,我通过安装推荐的软件包解决了这个问题: libc6-dev-mipsel-cross libc6-dev-mipsel-cross,libc-dev-mipsel-cross
这工作:
sudo apt-get install libc6-dev-mipsel-cross
就我而言,crti.o错误是由Matlab的执行pathconfiguration引起的。 例如,如果您之前未设置执行目录的path,则无法执行文件。 要做到这一点:文件> setPath,添加您的目录并保存。
使用gcc -B lib_path_containing_crt?.o
我解决它如下:
1)尝试使用find -name ctr1.o
来查找ctr1.o和ctri.o文件
我在我的电脑中得到以下内容: $/usr/lib/i386-linux/gnu
2)将该path添加到PATH
(也是LIBRARY_PATH
)环境variables(以便查看terminal中的名称:type env
命令):
$PATH=/usr/lib/i386-linux/gnu:$PATH $export PATH
在我的情况下, Ubuntu 16.04
我根本没有crti.o
:
$ find /usr/ -name crti*
所以我安装了开发者libc 6 -dev包:
sudo apt-get install libc6-dev