如何在32位系統上編譯它,以便它可以在64位系統下以向後兼容的方式運行?我知道這可以做到,因爲Adobe,Dropbox和其他公司都有這樣的二進制文件。我應該如何動態,靜態地鏈接它們?靜態只有一些庫和其他動態?Linux編譯簡單程序以在x86和x64上運行
我說的是一個簡單的代碼,如:
int main() {
printf("Hello world!\n");
}
謝謝!
如何在32位系統上編譯它,以便它可以在64位系統下以向後兼容的方式運行?我知道這可以做到,因爲Adobe,Dropbox和其他公司都有這樣的二進制文件。我應該如何動態,靜態地鏈接它們?靜態只有一些庫和其他動態?Linux編譯簡單程序以在x86和x64上運行
我說的是一個簡單的代碼,如:
int main() {
printf("Hello world!\n");
}
謝謝!
通常,您可以編譯這兩個版本,或僅編譯一個32位版本,並要求用戶安裝32位庫。
您可以通過爲每個命令添加-m32
來告訴GCC編譯32位。請注意,這需要multilib編譯器,並且您需要安裝必要的lib32 *文件。
所以,如果我得到這個'./hello:沒有這樣的文件或目錄'在一個32位編譯程序的64位系統是因爲我缺乏32位庫。 – bsteo
@xtmtrx否,可能是因爲您的可執行文件不存在或不存在,以及可執行文件。驗證輸出被稱爲'hello',然後執行'chmod + x hello',儘管編譯器應該自動執行此操作。此外,請執行'ldd hello'並查看是否可以找到所有庫。 – rubenvb
是可執行文件。 '不是一個動態的可執行文件'(用靜態庫編譯,但將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
通常。然後在64位系統上安裝32位庫。
它被稱爲交叉編譯。除非使用諸如configure或cmake之類的工具,否則會有點混亂。你也需要安裝gcc進行交叉編譯。 –
@Alexis我不會把'-m32'加到一個亂七八糟的命令上,我也不會把它叫做交叉編譯,儘管你可能會說這是嚴格意義上的。 – rubenvb
如果你看看配置腳本,他們甚至會調用64位上的-m32(反之亦然)交叉編譯設置...現在我同意,既然你可以在沒有特殊解釋器的情況下在你的64位平臺上運行32位軟件,這聽起來有點愚蠢。另一種方式雖然... –