Makefile:7: *** missing separator. Stop.
[解决办法]
makefile里禁止乱用TAB,只有命令所在的行才能且只能以TAB开头
其他的如,make变量的定义、赋值,make内定函数如(error “strings”)都不能以TAB开头,不然make会将其作为命令来处理
如例子,
第八行和第十行必须用tab开头
ifneq ($(KERNELRELEASE),)
obj-m += module.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M= $(PWD)
clean:
rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers
endif
[解决办法]
如果排除了TAB用空格代替的问题后、以及由中文“:”等问题后,问题还存在
那么很可能是文件编码格式的问题
查看一下Makefile 文件编码格式是不是utf-8的,还带有BOM标记在文件头
$ xxd -l 16 Makefile
0000000: efbb bf61 6c6c 3a0a 2020 6563 686f 2068 ...all:.
Makefile错误的常见原因
在编写和使用Makefile时,可能会遇到各种错误。下面列举了一些常见的Makefile错误原因:
-
语法错误
Makefile是一种基于规则的脚本语言,错误的语法会导致Makefile无法正确解析。常见的语法错误包括缩进错误、命令行格式错误等。 -
依赖关系错误
Makefile中定义的依赖关系是构建过程的核心,如果依赖关系定义不正确,会导致构建出错或者不更新目标文件。 -
变量引用错误
Makefile中使用变量来管理和传递参数,如果变量引用不正确,可能会导致构建过程出现错误。 -
命令执行错误
Makefile中的命令行用于执行构建任务,如果命令执行失败或者返回非零状态码,会导致构建中止。 -
环境配置错误
Makefile的执行可能受到环境变量的影响,如果环境配置不正确,可能导致构建过程出错。
调试构建问题的方法和技巧
- 使用
VERBOSE
选项
在调试Makefile时,可以使用VERBOSE选项来输出更详细的构建信息。VERBOSE选项可以通过在命令行中加入-V或者--debug
选项来启用。例如:
make -V target
- 使用
-d
选项
使用make命令的-d选项可以输出Makefile的调试信息,包括Makefile中的变量值、规则匹配和命令执行等。例如:
make -d target
- 使用
--just-print
选项
使用make命令的–just-print选项可以让Makefile只输出构建过程中要执行的命令,而不实际执行。这样可以帮助我们检查Makefile是否正确地生成了构建命令。例如:
make --just-print target
- 使用
--dry-run
选项
使用make命令的–dry-run选项可以让Makefile在执行前打印构建过程中要执行的命令,但不会实际执行。这样可以帮助我们预览构建过程中可能出现的问题。例如:
make --dry-run target
-
单步调试
可以通过在Makefile中添加调试信息、打印变量值和中间结果等方法,来实现在构建过程中的单步调试。 -
逐步构建
如果Makefile中包含多个目标和规则,可以通过逐步构建的方式,逐个目标地构建项目,帮助我们定位错误。