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

dal*_*ala 128 linux 64-bit gcc 32-bit cmake

是否有可能编译项目在32位cmakegcc一对64位系统?它可能是,但我该怎么做?

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

caf*_*caf 122

export CFLAGS=-m32
Run Code Online (Sandbox Code Playgroud)

  • `export`是什么意思?它属于哪里?Te头文件?`makefile`?不,作为一个初学者,完全不是我的答案. (6认同)
  • 那么问题是,这当然不一定足够.您可能也需要调整链接器! (5认同)
  • @caf,你能详细说明你的答案吗?你的答案非常简洁,并没有解释任何事情. (4认同)
  • 应该这样做.你也可以修改cmake脚本来创建一个32位目标 - 它只需要将`-m32`添加到`CFLAGS`,可能是通过设置`CMAKE_REQUIRED_FLAGS`. (2认同)

and*_*dri 76

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

  • 如何安装32位版本的库? (6认同)
  • @TomášZato`sudoapt-get install gcc-multilib` (2认同)

Nat*_*one 16

在CMake的更高版本中,在每个目标上执行此操作的一种方法是:

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

我不知道在全球范围内做到这一点的方法.

  • ...全局做:`cmake -D CMAKE_CXX_FLAGS = -m32.&& make` (3认同)

euc*_*cas 7

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

export CXXFLAGS=-m32
Run Code Online (Sandbox Code Playgroud)

这适用于cmake.


Dir*_*tel 6

一种方法是设置chroot环境.Debian有很多工具,比如debootstrap

  • 它为您提供了一个完整的环境,可以运行代码.我们使用它在64位主机上构建(并运行)完整的32位二进制文​​件 - 有时你只能获得32位版本的第三方库.对于Debian工作,我们使用它在64位主机上构建32位软件包. (3认同)
  • 为了构建32位应用程序而设置chroot环境感觉有点极端,不是吗?您推荐的任何特殊原因? (2认同)

Sam*_*ins 6

对于任何复杂的应用程序,我建议使用lxc容器.lxc容器是'在类固醇上的chroot和完全成熟的虚拟机之间的中间'.

例如,这是在Ubuntu Trusty系统上使用lxc构建32位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
Run Code Online (Sandbox Code Playgroud)

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