Ubuntu 16.04 64 位下编译 32 位程序
问题产生
博主最近需要在 Ubuntu 16.04 64 位环境下编译用于目标机的 32 位程序,可是直接在使用 gcc 编译时遇到了问题:
gcc hello.c -m32
错误提示:
/usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.a 时跳过不兼容的 -lgcc
/usr/bin/ld: 找不到 -lgcc
/usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86_64-linux-gnu/5/libgcc_s.so 时跳过不兼容的 -lgcc_s
/usr/bin/ld: 找不到 -lgcc_s
根据网上方法,已经安装了:
sudo apt-get install lib32ncurses5 lib32z1
但是仍然出现上述问题。由于新版 Ubuntu 16.04 不支持安装 ia32-libs
,因此就想能否有其他办法解决。
解决思路
看到报错提示时我就觉得奇怪,既然已经指明了 -m32
选项,为何 gcc 还会去 /usr/lib/gcc/x86_64-linux-gnu/
这个路径下去找库呢,于是怀着好奇去查了一下……果然博主的系统里面根本就没有 32 位的库文件,静态库和动态库都没有……于是就知道肯定是缺少依赖造成的……
解决方法
经检查,是博主刚装的新双系统的 Ubuntu 16.04 还缺少几个依赖:
sudo apt-get install build-essential module-assistant gcc-multilib g++-multilib
安装完成后,再次用 32 位模式编译,果然编译成功:
$ ls
hello.c Makefile
$ make
gcc hello.c -m32
$ ls
a.out hello.c Makefile
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=6660bedaa65f938439ff9c46489eff2860fe8cf6, not stripped
$ ./a.out
hello
个人主页
2019.1.3