2009-11-04 82 views
10

如何編譯在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

回答

14

您不允許在您的環境中更改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

2

我們假設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