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

有没有可能在 64位系统上用 cmakegcc32位中编译一个项目?也许吧,但我该怎么做呢?

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

173725 次浏览
export CFLAGS=-m32

一种方法是设置 chroot 环境

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

在 CMake 的后续版本中,针对每个目标的一种方法是:

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

我不知道有什么全球性的方法。

对于任何复杂的应用程序,我建议使用 Lxc 集装箱。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

这是关于 如何使用 lxc 在64位主机上构建32位 wine的维基页面。

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

export CXXFLAGS=-m32

这对 Cmake 很有用。