一、錯誤的解釋
在Linux下,編譯時常見的錯誤信息之一就是makefile missing separator,該錯誤信息常被誤解為缺失了分隔符,導致編譯錯誤。
實際上,這個錯誤信息的本質含義是出現了無效的字元和格式錯誤。檢查錯誤時,我們應該仔細檢查每個行的開頭是否有縮進,是否有非法字元等問題。
二、使用Tab而不是空格縮進
makefile中,使用tab鍵而不是空格來進行縮進是一個編寫良好的makefile的基本規範。因為makefile是一個使用Makefile語法的配置文件,Makefile語法對於縮進很敏感。TAB鍵和空格的區別:
foo : bar echo "hello world"
注意,行的開頭有一個TAB字元,如果將TAB替換為四個空格,就會出現「missing separator」錯誤。這是因為GNU Make工具不能識別空格縮進格式。
三、檢查編碼格式
編碼格式也可能會引起「missing separator」錯誤。因為makefile需要以UNIX格式編寫,所以如果您在Windows平台上創建了一個makefile,並在不轉換其格式的情況下將其移植到Linux上,則可能因為編碼格式不同而導致此錯誤。
檢查makefile的編碼格式,常見的有UTF-8和GBK等。使用vim命令可以輕鬆地查看文件編碼格式,命令如下:
vim file_name :set fileencoding
如果你發現makefile的編碼格式不同,請考慮將其轉換為正確的格式。Windows下的notepad++工具可以方便地將文件編碼格式轉換為UNIX格式,而在Linux下,iconv命令可以用於轉換文件編碼格式:
iconv -t utf8 -f gb2312 -o output_file input_file
四、檢查環境變數
makefile在執行時,會依賴一些環境變數來完成編譯工作,如果環境變數配置有誤或者缺失,也會導致「missing separator」錯誤。
在編寫makefile時,請確保檢查需要使用的環境變數是否正確配置,以及makefile是否使用了正確的環境變數名。
五、使用額外的工具
如果您遇到複雜的「missing separator」錯誤,可以考慮使用一些額外的工具來幫助您分析問題。
例如,您可以使用lindent工具來檢查makefile的代碼,並自動修復縮進格式錯誤。
sudo apt install lindent lindent my_makefile
完整的makefile示例
下面是一個包含多個目錄和文件的簡單的Makefile文件。
# Makefile SRCS := src/main.c src/foo.c src/bar.c OBJS := $(SRCS:.c=.o) INCLUDES := -I./src/include CFLAGS := -Wall -O2 $(INCLUDES) LFLAGS := -lm BINDIR := bin TARGET := $(BINDIR)/myprog .PHONY : clean all : $(TARGET) $(TARGET) : $(OBJS) | $(BINDIR) gcc $(OBJS) $(LFLAGS) -o $@ $(BINDIR) : mkdir $(BINDIR) %.o : %.c gcc $(CFLAGS) -c $< -o $@ clean : rm -rf $(BINDIR) $(OBJS)
在這個示例Makefile中,我們添加了注釋來需要展示編寫了注釋的好習慣。
同時,我們使用了.include目標來添加包含目錄,使用Wall選項啟用所有警告,以及O2選項啟用編譯優化。
對於「missing separator」錯誤,我們要注意縮進使用了TAB鍵而不是空格,並且代碼使用了Unix編碼格式。
另外,為了快速清理編譯生成的文件,我們添加了clean規則、all目標等。
原創文章,作者:EMBYG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333578.html