如何编译一个32位的二进制64位Linux机器上用gcc / cmake的(How to compi

2019-06-18 10:33发布

是否有可能在编译的32位与项目cmakegcc 64位系统上? 它可能是,但我怎么办呢?

当我尝试它为“无知”的方式,不设置任何参数/标志/等,只设置LD_LIBRARY_PATH找到链接库在~/tools/lib似乎忽略它,只考虑在名为lib64的子目录。

Answer 1:

export CFLAGS=-m32


Answer 2:

$ gcc test.c -o testc
$ file testc
testc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ 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
$ file testc
testc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ 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)



Answer 3:

在CMake的更高版本,这样做对每个目标的一个方法是:

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

我不知道的方式做到全球了。



Answer 4:

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

export CXXFLAGS=-m32

这适用于cmake的。



Answer 5:

一种方法是设置一个chroot环境。 Debian有许多为工具,例如debootstrap的



Answer 6:

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

例如,下面是一个使用LXC一个Ubuntu忠实的系统上构建32位酒的方式:

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

以下是有关wiki页面介绍如何使用LXC 64位主机上的32位葡萄酒 。



文章来源: How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake