

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、筆者在做移植時,將EmbestIDE環(huán)境下的例程移到RealViewMDK的過程中,曾經(jīng)遇到這樣一個問題:在生成工程時,編譯全部通過,但在鏈接時提示許多符號未定義!如果讀者也遇到過這個問題,請繼續(xù)看下去,如果鏈接時提示未定義的變量是一些內(nèi)聯(lián)函數(shù)(即使用了關(guān)鍵字__inline)。那么就是筆者遇到的問題了。希望這篇文章對您有所幫助。在MDK中使用關(guān)鍵字__inline時,除了執(zhí)行速度和占用空間和普通函數(shù)不一樣之外,還有以下與普通函數(shù)不一樣
2、的地方:表現(xiàn)為,不能將其申明為外部函數(shù),即不能將__inline函數(shù)定義在一個外部文件中然后在引用的文件中申明為extern類型。原因是MDK中使用的__inline函數(shù)時和標(biāo)準(zhǔn)C中的inline函數(shù)有相同的語義。在C標(biāo)準(zhǔn)中,一個內(nèi)聯(lián)函數(shù)在用到它的每個解釋單元需要相同的定義,這樣看來只有內(nèi)部鏈接的才可能內(nèi)聯(lián)。將外部文件中的函數(shù)鏈接并內(nèi)聯(lián)似乎不可能,特別是外部函數(shù)是非內(nèi)聯(lián)的。為了在不同文件之間的函數(shù)可以內(nèi)聯(lián),必須:?將這些函數(shù)放在一個通用
3、的頭文件中,例如foo.h;?將這些函數(shù)標(biāo)記為extern__inline;?在需要該內(nèi)聯(lián)函數(shù)時,#include內(nèi)聯(lián)函數(shù)所在的頭文件。當(dāng)編譯器決定不內(nèi)聯(lián)某個函數(shù)時,在編譯鏈接之后該函數(shù)只有一個拷貝。注:根據(jù)筆者的實驗發(fā)現(xiàn)也可以將內(nèi)聯(lián)函數(shù)直接定義為__inline。在MDK中如果將__inline函數(shù)申明為extern的話,在編譯時會通過,而在鏈接時會說這些函數(shù)沒定義。這點與EmbestIDE不同。EmbestIDE允許將內(nèi)聯(lián)函數(shù)在外部
4、文件中定義,在引用的文件中,只須申明為extern類型即可通過編譯鏈接。解決辦法,將內(nèi)聯(lián)函數(shù)定義在.h文件中,在需要引用的文件中包含該頭文件。這樣就可以調(diào)用頭文件中的內(nèi)聯(lián)函數(shù)了。并且能正確通過編譯、鏈接。其實在MDK中AT91RM9200的標(biāo)準(zhǔn)庫中也是這么做的,AT91RM9200的標(biāo)準(zhǔn)庫有兩個.h文件――AT91RM9200.h和lib_AT91RM9200.h,其中AT91RM9200.h中定義一些常量和外圍接口結(jié)構(gòu)體。其中l(wèi)ib_
5、AT91RM9200.h中存放的就是庫函數(shù),其庫函數(shù)均為內(nèi)聯(lián)函數(shù)。注:以上兩個頭文件存放的路徑為C:KeilARMINCAtmelRM9200。(其中MDK安裝路徑為C:Keil)筆者在做移植時,將EmbestIDE環(huán)境下的例程移到RealViewMDK的過程中,曾經(jīng)遇到這樣一個問題:在生成工程時,編譯全部通過,但在鏈接時提示許多符號未定義!如果讀者也遇到過這個問題,請繼續(xù)看下去,如果鏈接時提示未定義的變量是一些內(nèi)聯(lián)函數(shù)(即使用了關(guān)鍵字
6、__inline)。那么就是筆者遇到的問題了。希望這篇文章對您有所幫助。在MDK中使用關(guān)鍵字__inline時,除了執(zhí)行速度和占用空間和普通函數(shù)不一樣之外,還有以下與普通函數(shù)不一樣的地方:表現(xiàn)為,不能將其申明為外部函數(shù),即不能將__inline函數(shù)定義在一個外部文件中然后在引用的文件中申明為extern類型。原因是MDK中使用的__inline函數(shù)時和標(biāo)準(zhǔn)C中的inline函數(shù)有相同的語義。在C標(biāo)準(zhǔn)中,一個內(nèi)聯(lián)函數(shù)在用到它的每個解釋單元
7、需要相同的定義,這樣看來只有內(nèi)部鏈接的才可能內(nèi)聯(lián)。將外部文件中的函數(shù)鏈接并內(nèi)聯(lián)似乎不可能,特別是外部函數(shù)是非內(nèi)聯(lián)的。為了在不同文件之間的函數(shù)可以內(nèi)聯(lián),必須:?將這些函數(shù)放在一個通用的頭文件中,例如foo.h;?將這些函數(shù)標(biāo)記為extern__inline;?在需要該內(nèi)聯(lián)函數(shù)時,#include內(nèi)聯(lián)函數(shù)所在的頭文件。當(dāng)編譯器決定不內(nèi)聯(lián)某個函數(shù)時,在編譯鏈接之后該函數(shù)只有一個拷貝。注:根據(jù)筆者的實驗發(fā)現(xiàn)也可以將內(nèi)聯(lián)函數(shù)直接定義為__inli
8、ne。在MDK中如果將__inline函數(shù)申明為extern的話,在編譯時會通過,而在鏈接時會說這些函數(shù)沒定義。這點與EmbestIDE不同。EmbestIDE允許將內(nèi)聯(lián)函數(shù)在外部文件中定義,在引用的文件中,只須申明為extern類型即可通過編譯鏈接。解決辦法,將內(nèi)聯(lián)函數(shù)定義在.h文件中,在需要引用的文件中包含該頭文件。這樣就可以調(diào)用頭文件中的內(nèi)聯(lián)函數(shù)了。并且能正確通過編譯、鏈接。其實在MDK中AT91RM9200的標(biāo)準(zhǔn)庫中也是這么做的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新玉米使用時需要注意的問題
- 納稅需要注意問題
- 面試需要注意問題
- 創(chuàng)業(yè)需要注意的問題
- 簡歷需要注意的問題
- 冰箱內(nèi)存儲食物時需要注意的問題
- 云平臺使用中需要注意的幾個問題
- 公司注冊需要注意問題
- 幼兒膳食需要注意的問題
- 冬季需要注意哪些問題
- 男人需要在戀愛時需要注意哪幾點?
- 測壓軟管使用需要注意的事項
- 初創(chuàng)企業(yè)需要注意的財務(wù)問題
- 口譯考試錄音需要注意的問題
- 孕前需要注意的營養(yǎng)問題
- 利用郵件進(jìn)行營銷推廣時需要注意哪些問題
- 數(shù)據(jù)恢復(fù)中需要注意的問題
- 所有圖紙都需要注意的問題
- 公眾號在推廣時需要注意什么
- 淺談市政管道建設(shè)需要注意的問題
評論
0/150
提交評論