如何使用gcc / cmake在64位linux机器上编译32位二进制文​​件

是否有可能在64位系统上用cmakegcc编译32位项目? 这可能是,但我该怎么做呢?

当我尝试“无知”的方式,没有设置任何参数/标志/等,只是设置LD_LIBRARY_PATHfind~/tools/lib的链接库似乎忽略它,只能看名为lib64的子目录。

 export CFLAGS=-m32 
 $ gcc test.c -o testc
 $文件testc
 testc:用于GNU / Linux 2.6.9的ELF 64位LSB可执行文件,x86-64,版本1(SYSV),dynamic链接(使用共享库),不会被去除
 $ ldd testc 
     linux-vdso.so.1 =>(0x00007fff227ff000)
     libc.so.6 => /lib64/libc.so.6(0x000000391f000000)
     /lib64/ld-linux-x86-64.so.2(0x000000391ec00000)
 $ gcc -m32 test.c -o testc
 $文件testc
 testc:GNU / Linux 2.6.9的ELF 32位LSB可执行文件,英特尔80386,版本1(SYSV),dynamic链接(使用共享库),不剥离
 $ ldd testc
     linux-gate.so.1 =>(0x009aa000)
     libc.so.6 => /lib/libc.so.6(0x00780000)
     /lib/ld-linux.so.2(0x0075b000)

简而言之:使用-m32标志来编译一个32位的二进制文件。

另外,确保你已经安装了所有需要的库的32位版本(在我的情况下,我需要的所有Fedora都是glibc-devel.i386)

在后来的CMake版本中,每个目标上的一个方法是:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

我不知道在全球范围内做到这一点。

对于任何复杂的应用程序,我build议使用lxc容器 。 lxc容器是“在类固醇的chroot和完全成熟的虚拟机之间的东西”。

例如,以下是在Ubuntu Trusty系统上使用lxc构build32位wine的方法:

 sudo apt-get install lxc lxc-templates sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty sudo lxc-start -n my32bitbox # login as yourself sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list" sudo apt-get install devscripts sudo apt-get build-dep wine1.7 apt-get source wine1.7 cd wine1.7-* debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b shutdown -h now # to exit the container 

以下是关于如何在使用lxc的64位主机上构build32位wine的wiki页面。

一种方法是build立一个chroot环境。 Debian有许多工具,比如debootstrap

对于C ++,你可以这样做:

 export CXXFLAGS=-m32 

这适用于cmake。