Ubuntu 16.04 64 位下編譯 32 位程序

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章