Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Makefile 變量賦值尾隨空格導致 "command not found" 錯誤排查

編輯:Linux 教學

交叉編譯環境配置正確,但 make 執行時提示 make: arm-linux- command not found(注意 arm-linux- 後有空格)。本文分析 Makefile 語法陷阱:尾隨空格被視為命令一部分。

錯誤現場

CROSS_COMPILE = arm-linux- 
#                    ↑ 這裡有一個不可見的空格

展開後命令變為:

arm-linux-  -gcc ...
#        ↑ 空格被當作命令名一部分,導致查找 "arm-linux- " 而非 "arm-linux-"

Makefile 空格敏感性規則

  • 變量賦值尾部空格會被保留,並作為展開值一部分
  • 命令行首字符必須為 Tab,空格會導致 "missing separator" 錯誤
  • 變量引用 $(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

通用排查清單

  1. cat -A Makefile 顯示不可見字符($ 為行尾,^I 為 Tab,^M 為 CR)
  2. make -n 乾運行查看實際展開命令
  3. make -d 調試模式追蹤變量展開

延伸:常見 Makefile 陷阱

陷阱現象修正
命令行前用空格非 TabMakefile:2: *** missing separator. Stop.替換為 Tab
變量引用未加括號 $VAR僅取首字符必須 $(VAR) 或 ${VAR}
遞歸變量 = 導致無限展開make 卡死/報錯改用 := 即時展開
通配符 * 在變量定義中不展開SRC = *.c 字面量用 wildcard 函數:SRC = $(wildcard *.c)
Copyright © Windows教程網 All Rights Reserved