在64位的ubuntu,GCC8.2.0的系统上,如何编译一个32的程序?
查找GCC文档可知,编译64位程序使用-m64选项,例如:
gcc -m64 -O3 index.c -o index //该程序只能在64位机器上运行
编译32位程序使用-m32选项,例如:
gcc -m32 -O3 index.c -o index //该程序可以在32位或64位机器上运行
但是如果编译32位系统报如下错误:
/usr/bin/ld: skipping incompatible /home/zgl/gcc-8.2.0-exe/lib/gcc/x86_64-pc-linux-gnu/8.2.0/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
此时可能有两个原因:第一是你安装GCC时../configure
配置里面使用了--disable-multilib
,导致没有安装系统库,第二个原因可能是你安装的gcc-multilib、g++-multilib
库版本和你的gcc版本不匹配。
尝试1:
// 比如我gcc-8.2.0版本,使用如下命令安装multilib的话是安装的gcc-8.3.0版本
// 有些情况是,安装完成之后,系统自带的gcc能使用-m32了,但是自己安装的gcc还是不能使用
apt-get install gcc-multilib g++-multilib
或者
apt-get install gcc-8-multilib g++-8-multilib
// 使用apt-get install gcc-8.2-multilib g++-8.2-multilib是不行的
尝试2:
修改usr/bin/gcc
和/usr/bin/ld
,强制加入m32信息
经过尝试了以上方式,我的问题依然没有解决,于是我删除了GCC-8.2.0重新安装让它支持multilib,安装命令如下:
// 1.下载源码、解压
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.2.0/gcc-8.2.0.tar.gz
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/gmp-6.1.0.tar.bz2
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/mpc-1.0.3.tar.gz
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/mpfr-3.1.4.tar.bz2
tar xzvf gcc-8.2.0.tar.gz
tar -jxvf gmp-6.1.0.tar.bz2
tar -xzvf mpc-1.0.3.tar.gz
tar -jxvf mpfr-3.1.4.tar.bz2
mv gmp-6.1.0 gcc-8.2.0/
mv mpc-1.0.3 gcc-8.2.0/
mv mpfr-3.1.4 gcc-8.2.0/
cd gcc-8.2.0/
// 2.建立软连接
ln -s gmp-6.1.0/ gmp
ln -s mpc-1.0.3/ mpc
ln -s mpfr-3.1.4/ mpfr
// 3.建立编译目录
mkdir gcc-build
cd gcc-build/
// 4.配置configure 此时使用 --enable-multilib安装
../configure CFLAGS="-g3 -gdwarf-2 -O0" CXXFLAGS="-g3 -gdwarf-2 -O0" CFLAGS_FOR_TARGET="-g3 -gdwarf-2 -O0" CXXFLAGS_FOR_TARGET="-g3 -gdwarf-2 -O0" --enable-multilib --enable-languages=c,c++,fortran --prefix=/home/zgl/gcc-8.2.0-exe
// 5.编译安装
make -j 32
make install
安装完成之后我再source gcc,执行gcc -m32 -O3 index.c -o index
便能成功了。