DSP編程技巧之33---答疑解惑哪家強之(8)
答疑解惑哪家強?當(dāng)屬我們EEPW最強。。。接下來繼續(xù)了解一下與編譯器和鏈接器的常見錯誤、警告有關(guān)的問題原因和解決方法。
本文引用地址:http://butianyuan.cn/article/267641.htm46. Tag_Memory_Model attribute value of "1" that is different than one previously seen ("2"); combining incompatible files,是神馬意思?
這個錯誤表明鏈接器所鏈接的目標文件中存在不同的內(nèi)存模式,比如說有的目標文件使用了大內(nèi)存模式,而有的使用的是小內(nèi)存模式。修改的方法則是讓所有的文件在鏈接時都使用相同的內(nèi)存模式。
事實上這種錯誤出現(xiàn)的場合并不算太多,主要出現(xiàn)在工程中引用了別人提供的某些obj文件或者庫文件的時候。在C2000上,新建工程的時候推薦大家統(tǒng)統(tǒng)使用大內(nèi)存模式(-ml)選項。
47. Error: file grlib.lib
這個錯誤與上面那個錯誤的原因是類似的,表明鏈接器所鏈接的目標文件中存在不同的浮點支持模式。修改方法則是讓所有的目標文件和庫文件使用相同的浮點支持--float_support選項。
48. 為什么編譯的時候總是提示W(wǎng)arning: creating output section "xxx" without a SECTIONS specification?
在使用默認的cmd文件進行編程,而工程中有使用了某些cmd中未明確定義的段的時候,就會出現(xiàn)這個警告。因為沒有在cmd中定義這個段,所以鏈接器會使用默認的算法來創(chuàng)建和分配輸出段“XXX”;這樣雖然能保證程序的工作,卻不被建議這樣做,因為它不利于內(nèi)存地址空間的有效分配和管理。通常來說,最好不要有任何的鏈接器警告,以消除程序運行時潛在的bug。
49. 莫名其妙的gmake: Access is denied。
在編譯程序的時候,編譯器會生成一系列的中間文件,包括obj、lib、asm等等,這個過程被一些帶有主動防御系統(tǒng)的殺毒軟件和安全軟件當(dāng)作危險行為,因此就被禁止掉了,導(dǎo)致編譯失敗,如下圖所示:
所以在編譯程序的時候,最好禁用安全軟件,不然即使是安全軟件沒有直接阻止編譯,也會跳出各種各樣的詢問信息,不勝其擾。
50. Type 'xyz' or Symbol 'abc' could not be resolved。
這些錯誤一般是由Eclipse CDT (C/C++開發(fā)工具)錯報出的,而不是由TI本身的編譯器所給出的。目前的解決方法是:
從CCSv4的工程升級到CCSv5或者更高版本的時候,如果選擇的是project---導(dǎo)入工程,一般會有一定的兼容性問題,可能會產(chǎn)生這樣的錯誤。解決方案則是創(chuàng)建一個新的工作區(qū),然后把所有的源程序、庫文件、cmd文件等導(dǎo)入到新的工程中,重新配置工程選項,然后再編譯。
或者干脆忽略CDT的語法錯誤,方法是在CCS中點擊Window->Preferences->General->Editors->Text Editors->Annotations, 選擇C/C++ Indexer Markers,然后清除掉所有的選擇。
51. Warning: build attribute vendor section TI missing in "
出現(xiàn)這個問題,說明使用的庫文件是由一個老版本的編譯/鏈接工具所創(chuàng)建的,在使用新版本的工具進行編譯/鏈接時,這個老的庫文件缺失了某些屬性,導(dǎo)致了這個警告的產(chǎn)生。在C2000 DSP的開發(fā)中,有幾個場合特別容易出現(xiàn)此警告:
² 在新的編譯環(huán)境中,使用了一個老版本的IQmath庫文件。
² 在測試時,使用了老版本的編譯器生成的Flash API。
² 在使用高分辨率的HRPWM模塊時,使用了老版本的SFO庫文件來修正MEP。
這個警告總的來說并不影響程序的運行,我們即可以通過把老的庫文件換成最新版本來徹底解決此問題,也可以在cmd文件中使用--diag_suppress=16002來消除此警告信息。至于16002這樣的警告信息是如何歸類的,在CCS的編譯提示里就有:
#16002-D build attribute vendor section TI missing in "c:/ti/ccsv6/tools/compiler/C2000_6.2.2/lib/IQmath.lib
52. fatal error: file .....rts2800_fpu32.lib
這個致命錯誤說明對某些不是FPU32的目標文件啟用了--float_support=FPU32選項進行編譯,例如這個目標文件是由不含有FPU的器件上的編譯編譯而來的時候就會產(chǎn)生,也有可能是這個目標文件沒有使用FPU選項。解決的方法是:
² 如果導(dǎo)致錯誤的目標文件是支持FPU的,則使用-v28 --float_support=FPU32來編譯所有的程序。在CCS中,可以把這個選項作為全局選項,或者預(yù)編譯選項。
² 如果器件不支持FPU,則不要使用FPU32選項。這是因為在含有FPU的器件中,float類型的變量會傳遞到FPU寄存器中進行處理;而在不含有FPU的器件中,float類型的變量仍然會保存到棧中。
53. Warning: entry-point symbol other than "_c_int00" specified: "code_start"。
初學(xué)者經(jīng)常會遇到此問題。事實上這個警告并不會對程序的運行產(chǎn)生什么影響,它只是用來告訴我們,程序的入口點被編譯器給自動分配到code_start,而不是默認的_c_int00中;它們的效果是一樣的,含義請參考http://butianyuan.cn/article/262926.htm。TI提供的外設(shè)例子在編譯時也經(jīng)常會產(chǎn)生此警告。
54. Error: unresolved symbols remain....
符號FD$$MPY、FD$$TOL之類的找不到,這樣的問題也是初學(xué)者經(jīng)常遇到的。這樣的問題說明相關(guān)的庫函數(shù)被使用了,但是庫并沒有被添加到工程之中。例如,在程序中使用了c = IQdiv(a,b);這樣的程序,但是并沒有把IQmath.lib添加到工程中,則IQdiv就會被提示unsolved這樣的錯誤,解決方法則是把對應(yīng)的庫文件添加到工程里就好了。
特別說明:帶有兩個美元符號$$的函數(shù)一般都是實時運行庫RTS里的,一定要記得添加對應(yīng)的RTS庫文件。
55. Error: Tag_ISA attribute value of "2" that is different than one previously seen ("1"); combining incompatible files.
這個錯誤表明ISA版本這個屬性不正確。其中,1代表C27x,2代表C28x。在使用C28x時,應(yīng)該使用-v28這樣的選項來使用C28x模式,而不應(yīng)該再使用其它的兼容模式了。
56. Error: placement fails for object "csmpasswds"
在早期版本的CCS5.x編譯器/鏈接器中,有這個問題,鏈接器會不停地提示相同名字的段被既保存在page0,又被保存在page1之中,直到我們把它們改好;這算是一個bug吧,升級編譯工具codegen的版本,或者干脆升級整個ccs軟件,就可以解決此問題。
57. Warning: function declared implicitly
雖然這只是個警告,但是它表明函數(shù)的原型不存在,編譯器會對函數(shù)的參數(shù)和返回值做一些假設(shè),這就是bug的一種源頭,所以一定要把這個警告給消除掉。
c++相關(guān)文章:c++教程
評論