關於STM32頭文件包含出現No such file or directory和 invalid redeclaration of type name...的問題

    用keil sdk編譯STM32的程序時出現“.\inc\stm32f10x_conf.h(21): error:  #5: cannot open source input file "stm32f10x_type.h": No such file or directory”類似的問題,說明沒有搜到此頭文件,如果是用雙引號 “  ” 包含的頭文件,則問題肯定出在沒有把此頭文件放在工程文件夾內。

還有一個問題,已經把此頭文件放在了工程文件夾內,但是編譯時出現這個問題:.\inc\stm32f10x_type.h(28): error:  #256: invalid redeclaration of type name "s32" (declared at line487 of ".\inc\stm32f10x.h"),沒有任何懷疑,錯誤提示已經明確地說s32這個名字已經在inc\stm32f10x.h的487行定義過,所以stm32f10x_type.h中對s32的定義屬於重複定義,無效。

    那麼爲什麼會出現重複定義呢? 通過雙擊該提示到stm32f10x_type.h定義s32的地方,以及到stm32f10x.h的第487行定義s32的地方,會發現果然有同樣的定義,

如圖所示:

           


這是不同的頭文件,而且在stm32f10x.h這個頭文件中會包含stm32f10x_type.h(如圖,stm32f10x.h包含了另一個頭文件stm32f10x_conf.h,而在stm32f10x_conf.h裏面包含了stm32f10x_type.h,即相當於stm32f10x.h中包含stm32f10x_type.h——即①包含了②,②包含了③,那麼①就包含了③,有點囉嗦,但會顯得更清楚一些,呵呵),


爲什麼還會出現在這兩個相關聯的頭文件中定義了同一個名字s32呢?

問題就出在版本上。

在我的這個工程中,因爲我打算都用雙引號 “  ” 來包含頭文件,所以要把頭文件都放到我的工程文件夾裏,並設置好路徑(這裏不細說,有問題加後面的QQ聯繫)。問題就來了,stm32f10x.h這個頭文件是keil mdk中的,路徑爲\keil mdk\ARM\INC\ST\STM32F10x,而stm32f10x_conf.h是來自我先前安裝的IAR編譯裏的(前面說了,stm32f10x.h中是會包含stm32f10x_conf.h的。至於爲什麼會把IAR這個編譯器中的頭文件放進去,就不說了,呵呵),正確的方法是隻是用一個編譯器中的頭文件,保證版本的一致性,在我的工程中,應該使用kei mdk中的stm32f10x_conf.h,而不是IAR中的。

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


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

版本不同,裏面定義的內容不同,自然會出現不能替換的問題了。

所以要特別注意相關聯的頭文件(有包含關係的)是不是來自同一個版本。


如有問題,歡迎互相交流。

QQ:2524886219


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章