Ubuntu编写makefile文件编译时显示makefile:2: *** missing separator. Stop.”,修改tab键后仍报相同的错

在Ubuntu上编写makefile时遇到'*** missing separator. Stop.'错误。该问题通常由于命令行前的空格而非tab键引起,或者文件包含非英文字符。检查并修正makefile中的tab键,确保使用真实tab而不是空格,同时避免中文字符。通过修改vim配置,设置正确tab行为,并在文件中用真实tab替换空格,即可解决此编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Ubuntu上编写makefile文件,使用make命令进行编译,但是出现了makefile:2: *** missing separator. Stop.”这样的情况;

出现这种问题,根据错误提示,应该是makefile文件出现了问题,搜了一圈发现问题无非两种:

  • makefile文件中命令行的行首不能有空格,而要用tab键;
  • makefile文件中的字符有格式要求,必须是英文,不能有中文字符。 

基于上述问题进行排查,修改完发现还是提示相同的missing separator. Stop错误。问题真正的根源在于我们敲入的tab键不是真正的tab键,而是被四个空格代替了。接下来需要修改vim的配置。

在终端输入

vim ~/.vimrc

可以看到我们的tab键确实被四个空格代替.

在 ~/.vimrc文件中set expandtab 下面添加下面的语句

autocmd FileType make set noexpandtab

添加之后 Esc,:wq保存退出;打开makefile文件,将之前的假<tab>删除,再次插入tab。保存退出。

此次执行makefile文件就不会报missing separator. Stop错误了。

<think>我们正在解决Makefile:缺少分隔符(missing separator)的问题。 根据引用[1]和[4],错误信息为:makefile:4: *** missing separator. Stop. 引用[2]指出:在Makefile中,常见的错误包括缺少分隔符,这通常是因为规则的命令部分没有使用Tab缩进,而是使用了空格。 因此,解决这个问题的关步骤是: 1. 检查Makefile的第4行(根据错误信息指出的行号)。 2. 确保该行(以及所有规则下的命令)都是以Tab开头,而不是空格。 注意:在Makefile中,规则的命令必须以Tab字符开头,不能使用空格代替。 例如,一个正确的规则可能如下: target: dependencies [Tab]command # 这里[Tab]表示一个Tab字符 错误示例(使用空格): target: dependencies command # 这里使用了空格(四个或更多),但Makefile要求必须是Tab 因此,修复方法就是将命令前的空格替换为Tab。 但是,有时候我们可能无法直观看出是空格还是Tab,因此可以使用文本编辑器的显示空白字符功能来检查。 另外,引用[4]中提到了一个回答(83票赞同)也确认了这一点。 所以,具体步骤: 1. 打开Makefile文件2. 定位到第4行(如果错误发生在其他行,则定位到相应行)。 3. 检查该行是否是一个命令(在规则之后),如果是,确保它前面是一个Tab字符。 4. 如果不是Tab,则将其替换为Tab。 5. 保存文件,重新运行make命令。 注意:有时候整个文件都可能存在用空格代替Tab的情况,因此需要检查所有规则下的命令。 如果第4行不是命令,而是一个规则(如target: dependencies)或者其他指令,那么可能不需要Tab,但错误信息提示该行缺少分隔符,所以很可能该行应该是一个命令,但实际上没有用Tab开头。 另外,也要注意Makefile中其他可能出现此错误的地方,比如条件语句(如ifeq)中的命令同样需要Tab开头。 但是,条件语句本身(如ifeq, else, endif)不需要Tab,它们不是命令。 因此,总结:Makefile中命令(即需要由shell执行的部分)必须用Tab开头,其他结构则不需要。 如果用户无法确定,可以提供一个简单的Makefile示例,并指出如何修改。 根据用户的问题,我们只需要给出解决missing separator错误的方法。 由于用户没有提供具体的Makefile内容,我们只能给出一般性的解决方案。 但是,我们可以假设一个例子: 错误Makefile内容(第4行是命令,但使用了空格): ``` all: hello hello: main.c gcc -o hello main.c # 这里用了空格(四个空格) ``` 修改为(用Tab替换空格): ``` all: hello hello: main.c [Tab]gcc -o hello main.c # 这里用实际的Tab字符 ``` 注意:在文本编辑器中,Tab字符通常显示为多个空格,但本质是一个制表符。 因此,请确保在编辑Makefile时,命令前面按的是Tab,而不是空格。 另外,一些编辑器(如vim)可以用以下命令来显示差异: :set list # 这样Tab显示为^I,而空格显示为点(.)或其他符号 或者使用其他编辑器的显示空白字符功能。 最后,重新运行make命令,错误应该消失。 如果问题仍然存在,请检查整个Makefile中是否有其他行存在同样的问题。 根据引用[2]和[4],我们相信这是解决missing separator错误的标准方法。 因此,给用户的回答可以这样组织:</think>### Makefile :缺少分隔符(missing separator)的解决方法 该错误通常由 **Makefile 语法格式错误**导致,根本原因是 **命令行的缩进使用了空格而非 Tab 字符**。以下是详细解决方案: --- #### 错误原因分析 1. **核心问题** Makefile 要求所有命令行(例如 `gcc`, `rm` 等)必须以 **Tab 字符开头**,不能使用空格。 错误示例(使用空格缩进): ```makefile target: gcc -o file file.c # 错误!此处用空格缩进 ``` 2. **常见触发场景** - 复制粘贴代码时,Tab 被自动转换为空格 - 编辑器设置错误(如 IDE 自动将 Tab 替换为空格) - 手动输入时误用空格 --- #### 修复步骤 1. **定位错误行** 错误信息 `makefile:4: *** missing separator. Stop.` 中的 `:4` 表示问题出在 **第 4 行**。 2. **检查并替换缩进** - 用文本编辑器打开 Makefile - 定位到错误行(示例中为第 4 行) - 删除行首所有空格 - 改为 **按一次 Tab **(确保插入的是 Tab 而非空格) 3. **验证 Tab 字符** 在 Vim 中执行 `:set list` 可显示特殊字符(`^I` 表示 Tab,`$` 表示行尾): ```makefile target:^I ^Igcc -o file file.c$ # 正确:以 ^I(Tab)开头 ``` 4. **编辑器设置建议** 在 VS Code / Sublime 等编辑器中: - 禁用 **"Translate Tabs to Spaces"**(将 Tab 转为空格) - 开启 **"Show Whitespace"**(显示空白字符) --- #### 正确示例 ```makefile # 正确:依赖行无缩进,命令行用 Tab 开头 app: main.c utils.c [TAB]gcc -o app main.c utils.c # [TAB] 表示按 Tab clean: [TAB]rm -f app *.o ``` > ⚠️ 注意:示例中的 `[TAB]` 需替换为实际的 **Tab 字符**(按Tab )。 --- #### 预防措施 1.Makefile 开头声明 `.RECIPEPREFIX` 自定义命令前缀(需 Make 4.0+): ```makefile .RECIPEPREFIX = > # 改用 '>' 作命令前缀 all: > @echo "Hello" # 此时可用空格缩进 ``` 2. 使用编辑器插件(如 Vim 的 `vim-makefile`)自动检测语法。 --- ### 相关问题 1. Makefile 中变量赋值与条件判断的语法规则是什么? 2. 如何让 Makefile 兼容不同操作系统(Linux/macOS/Windows)? 3. Makefile 自动依赖生成(如 `gcc -M`)的实现原理? > 引用参考: > Makefile 命令必须以 Tab 开头是 GNU make 的基本语法规则 [^1][^2][^4]。编辑器配置建议基于主流开发工具的最佳实践。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值