如何编译在64位的linux系统的32位二进制不接触CFLAGS环境变量

问题描述:

如何编译在64位的linux系统的32位二进制不接触CFLAGS环境变量

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

的解决方案是不可能的,因为我使用的第三方软件和其他的东西,这是已经使用CFLAGS变量。我们的老板说,不允许修补他们的makefile。

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

+0

这是“第三方软件和其他东西”的依赖项,需要编译以及建立32位二进制文​​件时? – 2009-11-04 12:29:31

您不允许在您的环境中更改CFLAGS,但是您是否有任何理由暂时无法为构建构建它?

对于基于autotool包,我先试试:

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

一个写得很好的configure.ac文件应该尊重你的CFLAGS变量,并追加到它,而无需修改软件包源。

更新

假设,那么,你不能重新定义你的CC变量,要么,我会玩一些花样路径。使${HOME}/gcc32一个shell脚本调用gcc以下的(未经测试):

#!/bin/sh 
/usr/bin/gcc -m32 "[email protected]" 

然后在前面加上给你的路,当你想建立32位:

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

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

+0

不幸的是,makefile本身设置了CFLAGS,甚至更糟的是它是基于if条件的级联进行的。所以我不能轻易将这个因素纳入我的CFLAGS定义之外。 makefile编写者应该已经使用了另一个变量名称,并将CFLAGS留作其预期用途,但这是代码原样。 – Lothar 2009-11-04 13:26:59

+0

在以上更新中包含此新信息 – jvasak 2009-11-04 15:25:07

+0

您需要使用绝对路径,否则您将获得无限递归。 – 2009-11-04 15:28:39

我们假设gcc和朋友位于“/ usr/bin”中。让我们假设你有一个名为“〜/ .local/bin”的文件夹,它位于你的路径中。

 
#! /bin/bash 
/usr/bin/gcc -m32 [email protected] 

您同样可以创建一个“G ++”脚本内容如下:

 
#! /bin/bash 
/usr/bin/g++ -m32 [email protected] 

您可以在“〜/。当地/箱”如创建一个名为“海湾合作委员会” bash脚本基本上,根据需要继续执行“C++”,“cc”,“as”,“ld”等。使脚本可执行。确保“〜/ .local/bin”在你的PATH环境变量BEFORE“/ usr/bin”中。如果是这种情况,那么当makefile调用编译器时(假设它们使用相对路径),您的脚本将被调用。

+1

使用“$ @”(带引号)确保args中的空格处理正确。 – coppit 2015-08-23 23:57:28