强制 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
并查看可用的选项。在大多数情况下,您可以将 CFLAGS
、CXXFLAGS
和 LDFLAGS
变量提供给配置脚本。您可能还需要将 --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 位程序