交叉編譯環境配置正確,但 make 執行時提示 make: arm-linux- command not found(注意 arm-linux- 後有空格)。本文分析 Makefile 語法陷阱:尾隨空格被視為命令一部分。
CROSS_COMPILE = arm-linux-
# ↑ 這裡有一個不可見的空格
展開後命令變為:
arm-linux- -gcc ...
# ↑ 空格被當作命令名一部分,導致查找 "arm-linux- " 而非 "arm-linux-"
$(VAR) 不自動去除空格CROSS_COMPILE = arm-linux- # 無尾隨空格
# 或
CROSS_COMPILE := arm-linux- # 即時展開,亦無空格
需對齊視覺效果時,只能使用 Tab 鍵,不可用空格:
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar
cat -A Makefile 顯示不可見字符($ 為行尾,^I 為 Tab,^M 為 CR)make -n 乾運行查看實際展開命令make -d 調試模式追蹤變量展開| 陷阱 | 現象 | 修正 |
|---|---|---|
| 命令行前用空格非 Tab | Makefile:2: *** missing separator. Stop. | 替換為 Tab |
變量引用未加括號 $VAR | 僅取首字符 | 必須 $(VAR) 或 ${VAR} |
遞歸變量 = 導致無限展開 | make 卡死/報錯 | 改用 := 即時展開 |
通配符 * 在變量定義中不展開 | SRC = *.c 字面量 | 用 wildcard 函數:SRC = $(wildcard *.c) |