新聞中心

關(guān)于STM32頭文件

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
keil sdk編譯STM32的程序時(shí)出現(xiàn)“.incstm32f10x_conf.h(21): error: #5: cannot open source input file "stm32f10x_type.h": No such file or directory”類(lèi)似的問(wèn)題,說(shuō)明沒(méi)有搜到此頭文件,如果是用雙引號(hào) “ ” 包含的頭文件,則問(wèn)題肯定出在沒(méi)有把此頭文件放在工程文件夾內(nèi)。

還有一個(gè)問(wèn)題,已經(jīng)把此頭文件放在了工程文件夾內(nèi),但是編譯時(shí)出現(xiàn)這個(gè)問(wèn)題:.incstm32f10x_type.h(28): error: #256: invalid redeclaration of type name "s32" (declared at line487of ".incstm32f10x.h"),沒(méi)有任何懷疑,錯(cuò)誤提示已經(jīng)明確地說(shuō)s32這個(gè)名字已經(jīng)在incstm32f10x.h的487行定義過(guò),所以stm32f10x_type.h中對(duì)s32的定義屬于重復(fù)定義,無(wú)效。

本文引用地址:http://butianyuan.cn/article/201611/317808.htm

那么為什么會(huì)出現(xiàn)重復(fù)定義呢? 通過(guò)雙擊該提示到stm32f10x_type.h定義s32的地方,以及到stm32f10x.h的第487行定義s32的地方,會(huì)發(fā)現(xiàn)果然有同樣的定義,

如圖所示:

這是不同的頭文件,而且在stm32f10x.h這個(gè)頭文件中會(huì)包含stm32f10x_type.h(如圖,stm32f10x.h包含了另一個(gè)頭文件stm32f10x_conf.h,而在stm32f10x_conf.h里面包含了stm32f10x_type.h,即相當(dāng)于stm32f10x.h中包含stm32f10x_type.h——即①包含了②,②包含了③,那么①就包含了③,有點(diǎn)啰嗦,但會(huì)顯得更清楚一些,呵呵),

為什么還會(huì)出現(xiàn)在這兩個(gè)相關(guān)聯(lián)的頭文件中定義了同一個(gè)名字s32呢?

問(wèn)題就出在版本上。

在我的這個(gè)工程中,因?yàn)槲掖蛩愣加秒p引號(hào) “ ” 來(lái)包含頭文件,所以要把頭文件都放到我的工程文件夾里,并設(shè)置好路徑(這里不細(xì)說(shuō),有問(wèn)題加后面的QQ聯(lián)系)。問(wèn)題就來(lái)了,stm32f10x.h這個(gè)頭文件是keil mdk中的,路徑為keil mdkARMINCSTSTM32F10x,而stm32f10x_conf.h是來(lái)自我先前安裝的IAR編譯里的(前面說(shuō)了,stm32f10x.h中是會(huì)包含stm32f10x_conf.h的。至于為什么會(huì)把IAR這個(gè)編譯器中的頭文件放進(jìn)去,就不說(shuō)了,呵呵),正確的方法是只是用一個(gè)編譯器中的頭文件,保證版本的一致性,在我的工程中,應(yīng)該使用kei mdk中的stm32f10x_conf.h,而不是IAR中的。

那么我們看看這不同的編譯器中的同名頭文件有什么區(qū)別,如下圖:

左邊的是Keil中的,版本為V3.5.0,右邊是IAR中的,版本為V1.0,版本不同?。?!

版本不同,里面定義的內(nèi)容不同,自然會(huì)出現(xiàn)不能替換的問(wèn)題了。

所以要特別注意相關(guān)聯(lián)的頭文件(有包含關(guān)系的)是不是來(lái)自同一個(gè)版本。



關(guān)鍵詞: STM32頭文

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉