MDK升級後的標頭檔案衝突
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
//=====================================================================
//TITLE:
// MDK升級後的標頭檔案衝突
//AUTHOR:
// norains
//DATE:
// Friday 17-June-2011
//Environment:
// Keil MDK 4.2
// .NET Micro Framework Porting 4.1
//=====================================================================
因為在移植的時候,發現了不少MDK編譯的一些問題,於是便想升級到最新版本,看看是否這些存在的問題已經被修復。可是沒想到的是,在MDK 4.0可以順利編譯通過的.NET Micro Framework Porting Solution,到了MDK 4.2卻是會發生編譯錯誤,如圖所示:
從圖中可以看到,是usb_def.h檔案出錯,理由是某些型別沒有被定義。像這種情形我們出來起來是很有經驗的,十有八九是沒有包含stm32f10x.h檔案。也就是說,只要在包含usb_def.h之前包含stm32f10x.h檔案即可,比如:
- #include "stm32f10x.h"
- #include "usb_def.h"
依照該思路,查詢自己所建立的solution,才發現自己的程式碼中根本就沒有使用到usb_def.h檔案,而編譯的時候卻提示該檔案有錯!這究竟是怎麼回事呢?
經過對比才發現,MDK 4.2版本的" /Keil/ARM/RV31/INC"路徑下增加了USB的相關檔案,而其中的"usb.h"就是追魁禍首!
為什麼會如此呢?因為"usb.h"也是.NET Micro Framework Porting的一個程式碼檔案,其位於"$(SPOCLIENT) /DeviceCode/pal/COM/usb"!而程式碼中為了使用.NET Micro Framework的USB資源,所以簡單地如此包含了該標頭檔案:
- #include "usb.h"
但在對solution進行編譯的時候,首先搜尋的是"/Keil/ARM/RV31/INC"路徑,因此該"usb.h"便是"/Keil/ARM/RV31/INC/usb.h",而不是"$(SPOCLIENT) /DeviceCode/pal/COM/usb/usb.h"。
那應該如何解決這個問題呢?最簡單的方法可能大家都能猜到,直接將"/Keil/ARM/RV31/INC/usb.h"給刪掉!當然,這個方法是可行的,但卻感覺並不是那麼完美。誰知道刪掉它,會不會對別的方面有影響呢?這只是一個治標而不治本的方法。
其實還有更好的方式,在包含的時候,指出其相對路徑即可。比如我使用"usb.h"這個標頭檔案的原始碼是位於"$(SPOCLIENT) /DeviceCode/Targets/Native/STM32F10x/DeviceCode/USB/",根據之前所說的所需要的.NET Micro Framework Porting的"usb.h"是位於"$(SPOCLIENT) /DeviceCode/pal/COM/usb",那隻需要在程式碼中如此指出即可:
- #include "../../../../../../DeviceCode/pal/COM/usb/usb.h"
更改之後編譯,順利通過,如圖所示: