2010-08-17 257 views
54

我有一个专用程序,我试图在64位系统上使用。强制gcc在64位平台上编译32位程序

当我启动安装程序时,它工作正常,但在它尝试更新自身并编译一些模块并且未能加载它们之后。

我怀疑它是因为它使用gcc和gcc试图编译他们为64位系统,因此这个程序不能使用这些模块。

有什么办法(一些环境变量或类似的东西)强制gcc做一切为32位平台。 32位chroot会工作吗?

+0

尝试发布到stackoverflow。你可能会得到一个很好的回应 – 2010-08-17 10:25:27

+0

问题是安装程序,而不是写它@Nathan – 2010-08-17 10:47:23

+0

可能的重复[如何在64位Linux机器上用gcc/cmake编译32位二进制文​​件](http ://stackoverflow.com/questions/1272357/how-to-compile-a-32-bit-binary-on-a-64-bit-linux-machine-with-gcc-cmake) – 2015-03-18 05:15:44

回答

67

您需要让GCC使用-m32标志。

您可以尝试编写一个简单的shell脚本到您的$PATH并称之为gcc(确保您不覆盖原始gcc,并确保新脚本早于$PATH,并且它使用完整路径。GCC

我想你需要的代码只是取决于你的shell像/bin/gcc -m32 $*(该$*有没有包括所有的论据,虽然这可能是别的东西 - 非常重要)

+14

你还需要32位C库,以及在某些情况下程序链接的任何外部库的32位版本。 – 2010-08-17 11:12:54

+5

确实。标准库:C:'apt-get install gcc-multilib'; C++:'apt-get install g ++ - multilib'。 – Bart 2014-11-20 17:13:37

41

你可能会得到一个32位二进制通过应用Alan Pearce的方法,但您也可能会收到如下错误:

fatal error: bits/predefs.h: No such file or directory 

如果是这样的话,如果你有apt-get的,只是安装gcc-multilib的

sudo apt-get install gcc-multilib 
+0

对于C++项目,'sudo apt-get install gcc-multilib g ++ - multilib'。 – phoenix 2017-09-19 16:28:41

8

对于您直接编译使用gcc/g++任何代码,你将需要添加-m32选项到编译命令行,只需编辑您的Makefile中的CFLAGSCXXFLAGSLDFLAGS变量即可。

对于您可能正在使用的任何第三方代码,您必须确保何时构建它以将其配置为进行交叉编译。运行./configure --help并查看哪个选项可用。在大多数情况下,您可以将CFLAGSCXXFLAGSLDFLAGS变量提供给配置脚本。您可能还需要添加--build--host的配置脚本,所以你最终的东西像

./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 --build=x86_64-pc-linux-gnu --host=i686-pc-linux-gnu 

如果编译失败这可能意味着你需要你的64位计算机上安装一些32位应用程序开发包