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

时间:2009-08-13 14:35:28

标签: linux gcc 64-bit cmake 32-bit

是否可以在 64位系统上使用cmakegcc 32位中编译项目?它可能是,但我该怎么做?

当我尝试“无知”的方式,没有设置任何参数/标志/等,只需设置LD_LIBRARY_PATH以找到~/tools/lib中的链接库它似乎忽略它并且只查看子目录命名为 lib64

6 个答案:

答案 0 :(得分:120)

export CFLAGS=-m32

答案 1 :(得分:74)

$ 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)

答案 2 :(得分:15)

在CMake的更高版本中,每种目标的一种方法是:

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

我不知道在全球范围内采用这种方法。

答案 3 :(得分:6)

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

export CXXFLAGS=-m32

这适用于cmake。

答案 4 :(得分:5)

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

答案 5 :(得分:5)

对于任何复杂的应用程序,我建议使用lxc container。 lxc容器位于类固醇的chroot和完整的虚拟机之间的中间位置。

例如,这是在Ubuntu Trusty系统上使用lxc构建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

以下是关于how to build 32-bit wine on a 64-bit host using lxc的维基页面。

相关问题