2013-02-25 33 views
4

我正在編譯VS2012和GCC(CodeBlocks)for Windows下的項目。 在VS2012上一切正常。在GCC我獲得以下編譯錯誤:GCC-無效的註冊使用

C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|164|Error: invalid use of register| 
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|166|Error: invalid use of register| 
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|221|Error: invalid use of register| 
||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===| 

我使用的編譯器選項-fpermissive - 它應該有無關的錯誤。

我只是不明白爲什麼它指向Local Temp文件夾下的臨時文件,並說我使用了錯誤的寄存器?

有沒有人知道發生了什麼?

+0

GCC實際上不是一個單一的程序,它是一組接一個地運行的程序。首先是預處理器,然後是實際的編譯器,編譯器生成彙編器代碼,彙編器將生成彙編器代碼,彙編器生成鏈接器用於創建最終可執行文件的目標文件。錯誤消息中提到的文件是生成的彙編程序文件。雖然這對你的問題沒有多大幫助,但我希望能解釋爲什麼你有這些臨時文件。 – 2013-02-25 12:26:39

+0

@JoachimPileborg:看起來更像是一個編譯器bug。警告表明*潛在*語義錯誤,但如果彙編程序生成錯誤,則可能表示編譯器存在缺陷。 – 2013-02-25 12:36:40

+4

我的第二個最好的選擇是彙編器和編譯器的標誌不匹配 - 這是一個生成代碼的例子。對於SSE和一個需要傳統的x86指令集。我最好的選擇是,代碼包含asm指令,VS2012採用英特爾語法,而gcc預計AT&T。 asm指令按原樣傳遞給'as'階段。 – 2013-02-25 12:42:53

回答

4

看起來您在編譯器中遇到了一個錯誤。 錯誤信息(從「源」文件名判斷)來自 彙編程序。彙編程序應該生成一個 錯誤信息的唯一時間是在 彙編程序中存在某些非法信息,而C++編譯程序應該從生成非法的 彙編程序;如果它不能生成合法的彙編程序,則應該輸出錯誤消息並且失敗。

真正的問題是,當你得到這樣的消息時, 找出你的代碼觸發它的內容。 g ++有一個 選項,告訴它不要刪除任何中間文件 。使用它,然後嘗試查看 這些行中的設置文件中發生了什麼。 (當你要求g ++輸出 彙編程序時,它會提供很好的註釋以幫助找到相應的源程序 。我不知道這是否也是這樣,當 生成彙編程序作爲中間文件時。)然後嘗試 切割代碼如果情況變得更糟,則使用二進制搜索) ,直到您可以獲得一行或兩行程序的錯誤。 嘗試猜測他們有什麼特別的,並以不同的方式改變他們做同樣的事情 。

並且不要錯誤地向g ++報告錯誤。

+1

沒錯,除非有一些時髦的內聯程序集正在使用(程序員可以編寫他們想要的任何垃圾)。 – vonbrand 2013-02-25 13:58:19

+0

James Kanze,就是這樣,我使用你的建議來解決它。我會盡快發佈解決方案 – filipehd 2013-02-26 13:14:25

+0

詹姆斯Kanze,請看看我的答案,也許你知道第二個問題的答案。謝謝 – filipehd 2013-02-26 13:19:03

0

感謝James Kanze的建議,我決定告訴編譯器不要刪除臨時文件。這是由標誌位來完成:

-save-temps

正如詹姆斯所說,彙編器生成一些不錯的評論正好這對通知我們的C++代碼行拋出的錯誤。就我而言,它看起來並不接受這樣的指令:

asm 
(
    ".intel_syntax noprefix\n" 
    "lock dec [DWORD PTR eax]\n" 
    ".att_syntax \n" 
    : 
    : "a" (data) 
    : 
); 

我不知道他爲什麼不接受Intel語法了,因爲它與以前版本的GCC的工作,而現在我更新了它它現在不再。

無論如何,這樣的問題的解決方案是由詹姆斯提到的:只是不要刪除中間文件,以便您可以直接偵察到彙編代碼有什麼問題。

關於INTEL語法的問題,爲什麼它不起作用了?