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


129

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

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


1
将标志-m32传递给gcc是否足够?我该如何在cmake中做到这一点?
dala

Answers:


124
export CFLAGS=-m32

2
应该做的。您还可以修改cmake脚本以创建32位目标-可能只是通过设置将其添加-m32到中。CFLAGSCMAKE_REQUIRED_FLAGS
caf

5
好吧,问题在于这当然不一定足够。您可能还需要调整链接器!
lpapp 2013年

6
什么export意思 它属于哪儿?Te头文件?的makefile?不,对于初学者来说,这完全不是我的答案。
托马什Zato -恢复莫妮卡

1
@TomášZato:在shell提示符下,调用之前cmake(但是,如果您使用的是Makefile,那么您将使用它make)。
caf 2015年

4
@caf,能否请您详细说明您的答案?您的回答非常简洁,没有任何解释。
Bulat M.

76
$ gcc test.c -o testc
$文件testc
testc:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),用于GNU / Linux 2.6.9,未剥离
$ 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),动态链接(使用共享库),未剥离
$ 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)。


1
十分感谢!是的,我确实有32位版本的依赖项。
dala

6
如何安装32位版本的库?
托马什Zato -恢复莫妮卡

2
@TomášZato– sudo apt-get install gcc-multilib
马修·默多克

16

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

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

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


+1。我正在尝试在64位雪豹上构建32位taglib(developer.kde.org/~wheeler/taglib.html)。这对我有用。
edwardw

3
…在全球范围内做:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas's

7

对于C ++,您可以执行以下操作:

export CXXFLAGS=-m32

这适用于cmake。


6

一种方法是设置chroot环境。Debian为此提供了许多工具,例如debootstrap


2
设置chroot环境只是为了构建32位应用程序感觉有点极端,不是吗?您为何建议这样做的任何特殊原因?
Fredrik的

3
它为您提供了一个可以在其中运行代码的完整环境。我们使用它在64位主机上构建(和运行)完整的32位二进制文​​件-有时您只能获得32位的第三方库。对于Debian的工作,我们使用它在64位主机上构建32位软件包。
Dirk Eddelbuettel,2009年

我从未遇到过任何问题,因此在linux,Solaris或任何其他64位平台上都无法构建和运行完整的32位二进制文​​件。但是我不太使用Debian。
Fredrik

Frederik,您还将它们以32位部署在64位构建主机上吗?
Dirk Eddelbuettel 09年

@Dirk:32位二进制文​​件可同时在32位和64位计算机上工作,而64位二进制文​​件仅可在64位计算机上工作。不管是客户计算机还是构建主机。老实说,除非您正在构建内核模块,否则我看不出问题出在哪里。
Fredrik的

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

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


有趣。我可以用它atom在64位计算机上为32位编译文本编辑器吗?
安华2015年

1
@安华,我想是的。它应该可以构建任何东西。
山姆·沃特金斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.