2015-09-27 136 views
0

我寫了一個C程序,並使用someProgram.c保存並編譯到我的64位機器上。生成了「someProgram.out」文件。我將someProgram.out發送給朋友,但沒有在他的機器上執行。它報告「無法執行二進制文件」錯誤,當他試圖在他的虛擬機中安裝的Ubuntu 14.04上運行它。 如何編寫代碼,以便它可以在不同體系結構的計算機上運行,​​也可以在虛擬機上運行,​​而無需在所有計算機上編譯,即僅在我的計算機上編譯後才能運行?如何在不編譯它的情況下在不同的體系結構上編譯相同的C代碼?

+0

如果您使用交叉編譯器,您可以編譯您的程序用於不同的目標,但仍需要爲每個目標編譯它。 – melak47

+0

您必須爲體系結構或C解釋器使用仿真器,該解釋器也涵蓋使用的庫函數。 – Olaf

+1

編譯32位並安裝i386軟件包。 http://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit –

回答

2

「無法執行二進制文件」可能由許多不同的事情引起。如果體系結構真的不同,那麼除了重新編譯它(除了運行原始的操作系統和處理器體系結構的模擬器,但這是)或者將代碼重寫爲某種編譯中間形式(例如,可以編譯爲Java字節碼的Java本身可通過具有執行代碼的「Java虛擬機」進行移植。另一方面,如果問題在於二進制文件缺少一些依賴項 - 一些共享庫位於您的機器上,但不在您的朋友的機器上,那麼解決方案是安裝相應的庫(右側版)。或者使用靜態庫重新編譯,以便它不依賴於共享庫。

編譯C +或C++代碼的目的是生成一個可在特定OS /處理器架構上直接執行的二進制文件。 C和C++語言只能作爲源代碼而不是二進制可執行文件移植到其他操作系統/處理器軟件包中。

0

想象一下,你正在做一個100塊拼圖遊戲,你失去了一塊。所以你從一個不同的難題中偷了一塊,所以你會有100件。

問題是,新作品不是爲你的拼圖而製作的。它不適合。如果你已經從與你的完全相同的難題中獲得了你的第100張作品,它會奏效。 (「它在我的機器上運行」)

編譯器爲您的目標操作系統生成代碼。如果你是64位,那麼你的編譯器可能會默認創建一個64位的拼圖。如果你的朋友正在運行32位,那麼你的64位拼圖片將不適合他的拼圖。

告訴您的編譯器爲目標生成正確的代碼。

這個計算器的問題可能會幫助你走上正確的道路。如果沒有,如果寫得好改變代碼,,您可以更改編譯器標誌可以產生兩個不同的目標圖像(拼圖)

How do I create a single makefile for both 32- and 64-bit?

你的編譯器可能會尖叫各類取決於你如何寫警告你程序不依賴於OS中的位數。

如果你正在做跨平臺,那麼你將需要了解其他標誌。這是你學習的地方。

相關問題