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