2014-02-11 100 views
0

如何在32位系統上編譯它,以便它可以在64位系統下以向後兼容的方式運行?我知道這可以做到,因爲Adobe,Dropbox和其他公司都有這樣的二進制文件。我應該如何動態,靜態地鏈接它們?靜態只有一些庫和其他動態?Linux編譯簡單程序以在x86和x64上運行

我說的是一個簡單的代碼,如:

int main() { 
    printf("Hello world!\n"); 
} 

謝謝!

+1

它被稱爲交叉編譯。除非使用諸如configure或cmake之類的工具,否則會有點混亂。你也需要安裝gcc進行交叉編譯。 –

+1

@Alexis我不會把'-m32'加到一個亂七八糟的命令上,我也不會把它叫做交叉編譯,儘管你可能會說這是嚴格意義上的。 – rubenvb

+0

如果你看看配置腳本,他們甚至會調用64位上的-m32(反之亦然)交叉編譯設置...現在我同意,既然你可以在沒有特殊解釋器的情況下在你的64位平臺上運行32位軟件,這聽起來有點愚蠢。另一種方式雖然... –

回答

2

通常,您可以編譯這兩個版本,或僅編譯一個32位版本,並要求用戶安裝32位庫。

您可以通過爲每個命令添加-m32來告訴GCC編譯32位。請注意,這需要multilib編譯器,並且您需要安裝必要的lib32 *文件。

+0

所以,如果我得到這個'./hello:沒有這樣的文件或目錄'在一個32位編譯程序的64位系統是因爲我缺乏32位庫。 – bsteo

+0

@xtmtrx否,可能是因爲您的可執行文件不存在或不存在,以及可執行文件。驗證輸出被稱爲'hello',然後執行'chmod + x hello',儘管編譯器應該自動執行此操作。此外,請執行'ldd hello'並查看是否可以找到所有庫。 – rubenvb

+0

是可執行文件。 '不是一個動態的可執行文件'(用靜態庫編譯,但將libc保存爲動態文件)。 'hello:GNU/Linux 2.6.15,BuildID [sha1] = 0xdd94b04d4b8bca92e94f3e1ce13a97c180b30493,ELF 32位LSB可執行文件,Intel 80386,版本1(SYSV),動態鏈接(使用共享庫); '-rwxrw-rw- 1 xtmtrx xtmtrx 22068 Feb 11 12:31 hello' – bsteo

3

通常。然後在64位系統上安裝32位庫。

相關問題