2011-10-04 127 views
4

我正在使用Code :: Blocks開發一個C應用程序,並且需要針對多個平臺(32位,64位)。我的開發框是64位的,所以我試圖在項目設置中檢查編譯器的i386(-march = i386)選項。現在,當我編譯:當使用Code :: Blocks編譯時定位不同的CPU - 理解錯誤

mainc:1:錯誤:您選擇了不支持X86-64運算指令集CPU

  1. 我不明白這條消息!通過指定i386不應該只是生成x86指令(不是-64)?除此之外,我的CPU是X86-64,爲什麼說我的CPU不支持這個?

  2. 我這樣做是錯誤的嗎?有針對不同架構的正確方法嗎?

回答

3

此處必須分清幾件事情:

  • 有32位和64位 「平臺」,關於相同處理器上運行。相同的X86-64處理器可以在 x86或AMD64模式下運行。除此之外,這還決定了可用寄存器的數量,它們的大小,堆棧佈局,不同的調用約定和一些不同的操作碼(另請注意,在許多操作系統中,32位代碼將在64位操作系統的某種兼容層中運行,而無問題)
  • 的編譯器,其中一個這些平臺,並且有編譯器可以生成或者兩個(但不能同時)。
  • 編譯器可以是與程序構建的不同平臺(所謂的交叉編譯器,非常常見的事情,例如爲嵌入式系統開發時,但也可以交叉編譯用於Windows-32從Linux -64或其他方式,或在Win32計算機上爲Win64編譯)。
  • 除了平臺,生成的代碼(-march開關)中還有一個模型特定的差異。這決定了什麼樣的處理器代碼,它決定了什麼指令可以用於生成代碼。並非所有平臺和體系結構的組合都是有效的(這是你的問題:假設一個25歲的386處理器意味着它不可能在AMD64模式下運行)。
  • 或者,您甚至可以安排與您生成代碼不同的內容。例如,您可以生成使用Pentium III指令的代碼,但計劃使用Core i7。這將在幾乎每個處理器上運行(次優,但它會運行),並且在最新的生產線上優化運行。
  • 最後,還有許多開關,如-msse系列,它們進一步啓用/禁用指令。

您沒有指定「Windows」或「Linux」或其他任何東西,所以很難對您的問題給出確切的答案,但讓我們假設您可能正在使用例如MingW-w64。該編譯器允許您創建32位和64位代碼,具體取決於您所做的操作。顯然,如果你告訴它在64模式下生成代碼(默認!),那麼i386不是一個好的選擇。如果你將它作爲命令行選項-m32,它將生成32位代碼,並且它將工作。

如果你告訴究竟是你使用的是什麼編譯器,它可能有助於找到更具體的答案。例如,Code :: Blocks(可選)隨Windows上的TDM 4.5.1構建而來,但使用其他操作系統下的任何內容。

+0

很好的解釋...我使用CentOS x86-64,帶有gcc編譯器。我編譯時需要針對32位Linux和64位Linux(所以我可以爲兩種架構提供產品)。我不知道我的代碼的用戶有哪些特定的CPU,所以我認爲我必須是非常通用的。 –

+0

如果你有CentOS x86-64,那麼你的編譯器會爲AMD64平臺生成代碼。我不使用CentOS,所以無法確定,但嘗試編譯器是否接受'-m32'。如果確實如此,那對你有好處,沒有別的可以做。如果沒有_not_,則必須安裝32位交叉編譯器的RPM(可同時安裝兩個編譯器),並在Code :: Blocks(重複,然後編輯)中配置新的編譯器設置,使用交叉編譯器的正確可執行文件名(它們將被命名爲'gcc-centos-i586'或類似名稱,請查看'/ usr/bin'以確定確切的名稱) – Damon