現象描述
專案中同時存在 startup_stm32f10x_ld.s、startup_stm32f10x_md.s、startup_stm32f10x_hd.s 多個啟動文件,按理說會導致重複定義編譯錯誤,但實際編譯卻通過。原因在於 KEIL 通過「Include in Target Build」屬性控制哪個文件參與編譯。
圖標識別
項目樹中,被勾選編譯的文件圖標無紅點,未勾選的文件圖標帶有三個紅點(表示排除)。
專案中多啟動文件共存狀態
配置步驟
- 右鍵點擊目標啟動文件(如
startup_stm32f10x_hd.s)→ Options for File 'xxx.s'。
- 在彈出的對話框中勾選 Include in Target Build。
- 其餘啟動文件確保未勾選該選項。
文件屬性配置對話框
原理解析
- KEIL 編譯器僅處理標記為「Include in Target Build」的源文件。
- 未勾選文件僅作為備選參考,不參與編譯鏈接,避免符號重複定義。
- 此機制允許同一專案根據 Target 不同(如 Debug/Release、不同芯片型號)快速切換啟動文件,無需物理刪除/添加文件。
最佳實踐建議
- 根據實際芯片 Flash 容量,只勾選對應容量等級的啟動文件(ld/md/hd)。
- 若使用 STM32CubeMX 生成代碼,會自動根據芯片型號選擇正確啟動文件並設置該屬性。
- 避免手動修改啟動文件內容;如需調整堆疊/堆大小,建議在 CubeMX 中配置或直接編輯對應
.s 文件的 Stack_Size/Heap_Size 宏。