我有一個用C編寫的項目,最初是在Linux上完成的,但現在必須在Windows上完成。部分代碼包括在幾個地方Cygwin gcc - asm錯誤:
asm("movl temp, %esp");
但是,這會導致「未定義的引用'臨時'」的錯誤此行。
這對使用gcc 4.3.2編譯器(在另一臺機器上測試過)在Linux上編譯沒有任何問題,這是我在Cygwin上的版本。有沒有另外一種方法來完成這條線路正在做的事情?
我有一個用C編寫的項目,最初是在Linux上完成的,但現在必須在Windows上完成。部分代碼包括在幾個地方Cygwin gcc - asm錯誤:
asm("movl temp, %esp");
但是,這會導致「未定義的引用'臨時'」的錯誤此行。
這對使用gcc 4.3.2編譯器(在另一臺機器上測試過)在Linux上編譯沒有任何問題,這是我在Cygwin上的版本。有沒有另外一種方法來完成這條線路正在做的事情?
你需要從
asm("movl temp, %esp");
改變cygwin的版本
asm("movl _temp, %esp");
是的,這是相同的編譯器和彙編,但他們與主機系統的兼容性設置不同。
您可以隔離系統依賴的符號簡單地告訴GCC中與特定名稱使用前綴:
int *temp asm("localname");
...
__asm__("movl localname,%esp");
這避免了某些類型的#if和刪除主機操作系統的依賴,但增加了一個編譯器的依賴。說到編譯器擴展的,有些人會寫(見info as
)是這樣的:
#ifdef __GNUC__
__asm__("movl %[newbase],%%esp"
:
: [newbase] "r,m" (temp)
: "%esp");
#else
#error haven't written this yet
#endif
這裏的想法是,這個語法允許編譯器來幫助你,通過查找temp
,即使它臥談在寄存器或者需要幾條指令來加載,也可以避免與您發生衝突,這是因爲它使用的是一個註冊表。它需要這個,因爲編譯器沒有以任何方式解析簡單的__asm__()
。
就你而言,你似乎正在實現自己的線程包,所以這些都不重要。 Gcc不打算使用%esp來進行計算。 (但爲什麼不只是使用pthreads ...?)
謝謝,但這給了我同樣的錯誤:「未定義的引用_temp'」 – Scott 2009-09-12 15:58:19
剛剛嘗試__asm __(「movl _temp,%esp」);現在一切正常。 – Scott 2009-09-12 16:03:57