2013-05-30 20 views
7

已經改變了我有很長的雙領域的結合。合格工會長雙ABI在GCC 4.4

我初始化一個字段,並把它傳遞給一個函數。

my_union foo; 
foo.long_double = 10.10; 
bar = baz(foo); 

當編譯此代碼我得到:

the ABI of passing union with long double has changed in GCC 4.4 

似乎與這裏提到的更改:http://gcc.gnu.org/gcc-4.4/changes.html

這是否意味着我無法通過具有長兼作領域的工會?爲什麼是這樣?我該如何解決這個問題,因爲我想使用long double來存儲大數值。

回答

9

這意味着什麼是生成的代碼是不是與GCC的早期版本編譯的代碼的二進制兼容的,所以如果你的庫,通過它與當前版本和以前的版本編譯的二進制文件之間,它是行不通的。 (請參閱有關內存佈局網絡傳輸信息的意見和保存到文件)

你可以從你提供的鏈接見:

Code built with previous versions of GCC that uses any of these is not compatible with code built with GCC 4.4.0 or later.

要麼不去做,或者確保所有使用更改日誌中提及的聯合的代碼將使用相同的編譯器版本(或技術上的ABI)進行編譯。

http://en.wikipedia.org/wiki/Application_binary_interface

+1

一澄清:該文檔說,ABI傳遞這些工會作爲參數發生了變化,不是他們的內存佈局(可能是涉及的寄存器)。因此,將它們移動到網絡上或將它們保存在文件中應該是安全的。 – rodrigo

+0

已更新的答案。 – xaxxon

+0

我將該字段更改爲雙倍,現在可以工作。但是爲什麼設計決定這個雙重禁止? – jluu

0

嘗試使用選項-msse2或-march = K8而compilling

+0

從GCC更新日誌,它很可能是新版本的描述可能是做了正確的方式,所以你應該儘量使工作現在是如何尋找解決方法,可能甚至沒有必要了。但如果你需要它,這可能值得一看 - 我不知道。 – xaxxon