强制 gcc 在 64 位平台上编译 32 位程序

Posted

技术标签:

【中文标题】强制 gcc 在 64 位平台上编译 32 位程序【英文标题】:Force gcc to compile 32 bit programs on 64 bit platform 【发布时间】:2011-03-30 22:26:26 【问题描述】:

我有一个专有程序,我正试图在 64 位系统上使用它。

当我启动设置时,它工作正常,但在它尝试更新自身并编译一些模块之后,它无法加载它们。

我怀疑这是因为它使用 gcc 并且 gcc 尝试将它们编译为 64 位系统,因此该程序无法使用这些模块。

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

【问题讨论】:

尝试发布到 ***。你可能会在那里得到很好的回应 问题在于安装程序,而不是写它@Nathan How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake 的可能重复项 【参考方案1】:

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

您可以尝试为您的 $PATH 编写一个简单的 shell 脚本并将其命名为 gcc(确保您没有覆盖原始 gcc,并确保新脚本在 $PATH 中更早出现,并且它使用GCC 的完整路径。

我认为您需要的代码类似于/bin/gcc -m32 $*,具体取决于您的shell($* 包含所有参数,尽管它可能是其他东西——非常重要!)

【讨论】:

您还需要 32 位 C 库,以及在某些情况下程序链接到的任何外部库的 32 位版本。 确实如此。标准库:C:apt-get install gcc-multilib; C++:apt-get install g++-multilib.【参考方案2】:

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

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

如果是这种情况,如果你有 apt-get,只需安装 gcc-multilib

sudo apt-get install gcc-multilib 

【讨论】:

对于 C++ 项目,sudo apt-get install gcc-multilib g++-multilib.【参考方案3】:

对于您直接使用gcc/g++ 编译的任何代码,您需要在编译命令行中添加-m32 选项,只需在你的Makefile

对于您可能使用的任何第 3 方代码,您必须确保在构建它时对其进行配置以进行交叉编译。运行./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 位开发包

​​>

【讨论】:

以上是关于强制 gcc 在 64 位平台上编译 32 位程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 gcc 32bit 编译,作为带有 -m64 的 64 位程序

exec: "gcc": executable file not found in %PATH%

GCC编译

MinGW64位32位问题求教

MacOSX64位机器上gcc编译32位x264静态库

64位linux编译32位程序