此連接器錯誤是通常與-Olink
優化-auto_sda
無關。鏈接器看到你的整個程序,並會盡量不要通過autoSDAizing超過64K的數據來搞砸它。 (它仍然可能是一個連接錯誤,但這是不可能的。)
這個錯誤通常是因爲有人誰是不的感知作爲接頭具有已經投入超過64K字節到SDA部分的連接之前甚至有機會去嘗試一下。該unperceptive人可能是你,如果你不喜歡的東西
#pragma startsda
int small_data[10000]; // 40Kbytes
int small_data_also[10000]; // another 40Kbytes
#pragma endsda
(可能跨多個文件分割;事實上,我認爲,如果你嘗試創建超過64K SDA的你會得到一個編譯器或彙編診斷一個文件)。
但unperceptive個人也可能是編譯器,如果你傳遞選項,例如-sda=4
(因爲如果你扔了#pragma startsda
周圍的整個文件中的4個字節或更小的每一個全局變量的作用),你有一個噸的全球變數。編譯器會高興地在每個20個單獨的文件中SDAize 10,000字節,然後鏈接器會抱怨你正在處理200,000字節的SDA。 (鏈接器是足夠聰明,改寫常規數據引用到SDA引用,但從來沒有被教導如何改寫事態朝着相反的方向。)
最後,即使你認爲你不及格-sda=
,你可能會感到驚訝。用-#
或-v
選項運行驅動程序。 IIRC,ccintppc
默認通過暗號傳遞-sda=4
。你可以讓司機停止「幫助」你;只需通過-sda=none
或-sda=0
,這應該覆蓋驅動程序的默認值。您可能需要逐個文件地傳遞此選項,從coldest code開始。
順便說一句,我遇到過的唯一一件事是提到可能會有某種不兼容的庫構建使用SDA和那些不是。 – Gary 2010-05-07 11:36:31