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