【问题标题】:How to compile a 32-bit binary on a 64-bit linux machines without touching the CFLAGS environment variable如何在不接触 CFLAGS 环境变量的情况下在 64 位 linux 机器上编译 32 位二进制文​​件
【发布时间】:2010-12-13 00:04:52
【问题描述】:

解决办法

How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake

不可能,因为我使用 3rd 方软件和其他已经使用 CFLAGS 变量的东西。并且不允许修补他们的 makefile - 我的老板说。

所以我必须找到另一种方法来执行它。也许有一些符号链接的魔法将对 gcc 的调用重定向到 32 位版本的编译器(希望不会动态检测到默认目标)。

【问题讨论】:

  • 在构建 32 位二进制文​​件时,这个“第三方软件和其他东西”是否也是需要编译的依赖项?

标签: linux gcc 64-bit compilation freebsd


【解决方案1】:

您不允许在您的环境中更改 CFLAGS,但是您是否有任何理由不能在构建时临时覆盖它?

对于基于自动工具的软件包,我会先尝试:

CFLAGS="-m32" ./configure [opts]
make
make install

编写良好的 configure.ac 文件应该尊重您的 CFLAGS 变量并附加到它,而不需要您修改包源。

更新

那么,假设您也无法重新定义 CC 变量,我会玩一些路径技巧。在${HOME}/gcc32 中创建一个名为gcc 的shell 脚本,其中包含以下内容(未经测试):

#!/bin/sh
/usr/bin/gcc -m32 "$@"

然后在您想要构建 32 位时将其添加到您的路径中:

export PATH=${HOME}/gcc32:${PATH}

明显的修改将支持g++icc 或任何其他编译器。

【讨论】:

  • 不幸的是,makefile 本身设置了 CFLAGS,更糟糕的是,它是基于一系列 if 条件执行此操作的。所以我不能轻易地将其纳入我的外部 CFLAGS 定义中。 makefile 编写器应该使用另一个变量名并保留 CFLAGS 用于其预期目的,但这就是代码。
  • 需要使用绝对路径,否则会得到无限递归。
  • 注意:如果软件使用pkgconf / pkg-config 进行CFLAG 设置检测,您可能需要设置$PKG_CONFIG_LIBDIR(例如Debian:PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu/pkgconfig)。
【解决方案2】:

假设 gcc 和朋友位于“/usr/bin”。我们还假设您的路径中有一个名为“~/.local/bin”的文件夹。您可以在“~/.local/bin”中创建一个名为“gcc”的 bash 脚本,例如:

#! /bin/bash /usr/bin/gcc -m32 $@

您可以类似地创建一个“g++”脚本,其内容如下:

#! /bin/bash /usr/bin/g++ -m32 $@

基本上,根据需要继续为“c++”、“cc”、“as”、“ld”等执行此操作。使脚本可执行。确保“~/.local/bin”在“/usr/bin”之前的 PATH 环境变量中。如果是这种情况,那么当 makefile 调用编译器(假设它们使用相对路径)时,将调用您的脚本。

【讨论】:

  • 使用 "$@"(带引号)确保 args 中的空格得到正确处理。
猜你喜欢
  • 2010-11-19
  • 2012-11-19
  • 2017-12-12
  • 1970-01-01
  • 2011-11-26
  • 2012-04-12
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多