Makefile (12)— Makefile 常见的错误信息

1、常见的错误信息

make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 -、或者 make 使用 -k 选项执行时。
make 执行过程的致命错误都带有前缀字符串 ***。错误信息都有前缀,一种是执行程序名作为错误前缀(通常是 make);另外一种是当 Makefile 本身存在语法错误无法被 make 解析并执行时,前缀包含了 Makefile 文件名和出现错误的行号。

在下述的错误列表中,省略了普通前缀:

[FOO] Error NN
[FOO] signal description

这类错误并不是 make 的真正错误。它表示 make 检测到 make 所调用的作为执行命令的程序返回一个非零状态(Error NN),或者此命令程序以非正常方式退出(携带某种信号)。
如果错误信息中没有附加 *** 字符串,则是子过程的调用失败,如果 Makefile 中此命令有前缀 -,make 会忽略这个错误。

1.1、missing separator.

missing separator. Stop.
missing separator (did you mean TAB instead of 8 spaces?). Stop.

错误的原因:不可识别的命令行,make 在读取 Makefile 过程中不能解析其中包含的内容。GNU make 在读取 Makefile 时根据各种分隔符( : , = , [TAB] 字符等)来识别 Makefile 的每一行内容。这些错误意味着 make 不能发现一个合法的分隔符。
出现这些错误信息的可能的原因是(或许是编辑器,绝大部分是ms- windows的编辑器)在 Makefile 中的命令之前使用了4个(或者8个)空格代替了 [Tab] 字符。这种情况,将产生上述的第二种形式产生错误信息。且记,所有的命令行都应该是以 [Tab] 字符开始的。

1.2、commands commence before first target

commands commence before first target. Stop.

Makefile 可能是以命令行开始:以 [Tab] 字符开始,但不是一个合法的命令行(例如,一个变量的赋值)。命令行必须和规则一一对应。

1.3、missing rule

missing rule before commands. Stop.

错误的原因可能是一行的第一个非空字符为分号,make 会认为此处遗漏了规则的 target: prerequisite 部分。

1.4、No rule

No rule to make target 'XXX'.
No rule to make target 'XXX ', needed by 'yyy'.

无法为重建目标“XXX”找到合适的规则,包括明确规则和隐含规则。
修正这个错误的方法是:在 Makefile 中添加一个重建目标的规则。其它可能导致这些错误的原因是 Makefile 中文件名拼写错误,或者破坏了源文件树(一个文件不能被重建,可能是由于依赖文件的问题)。

1.5、No targets

No targets specified and no makefile found. Stop.
No targets. Stop.

第一个错误表示在命令行中没有指定需要重建的目标,并且 make 不能读入任何 Makefile 文件。
第二个错误表示能够找到 Makefile 文件,但没有终极目标或者没有在命令行中指出需要重建的目标。这种情况下,make 什么也不做。

1.6、Makefile not found.

Makefile 'XXX' was not found.
Included makefile 'XXX' was not found.

没有使用 -f 指定 Makefile 文件,make 不能在当前目录下找到默认 Makefilemakefile 或者 GNUmakefile )。使用 -f 指定文件,但不能读取这个指定的 Makefile文件。

1.7、overriding commands for target

warning: overriding commands for target 'XXX'

对同一目标 XXX 存在一个以上的重建命令。GNU make 规定:当同一个文件作为多个规则的目标时,只能有一个规则定义重建它的命令(双冒号规则除外)。如果为一个目标多次指定了相同或者不同的命令,就会产生第一个告警;

1.8、gnoring old commands for target

warning: ignoring old commands for target 'XXX'

告警信息说新指定的命令覆盖了上一次指定的命令。

1.9、dependency dropped

Circular XXX <- YYY dependency dropped.

规则的依赖关系产生了循环:目标 XXX 的依赖文件为 YYY,而依赖 YYY 的依赖列表中又包含 XXX

1.10、Recursive variable references itself

Recursive variable 'XXX' references itself (eventually). Stop.

make 的变量 XXX(递归展开式)在替换展开时,引用它自身。无论对于直接展开式变量(通过 := 定义的)或追加定义( += ),这都是不允许的。

1.11、Unterminated variable reference

Unterminated variable reference. Stop.

变量或者函数引用语法不正确,没有使用完整的的括号(缺少左括号或者右括号)。

1.12、insufficient arguments to function

insufficient arguments to function 'XXX'. Stop.

函数 XXX 引用时参数数目不正确。函数缺少参数。

1.13、pattern 相关错误

missing target pattern. Stop.
multiple target patterns. Stop.
target pattern contains no '%'. Stop.             
mixed implicit and static pattern rules. Stop.

不正确的静态模式规则。
第一条错误的原因是:静态模式规则的目标段中没有模式目标;
第二条错误的原因是:静态模式规则的目标段中存在多个模式目标;
第三条错误的原因是:静态模式规则的目标段目标模式中没有包含模式字符“%”;
第四条错误的原因是:静态模式规则的三部分都包含了模式字符“%”。正确的应该是只有后两个才可以包含模式字符“%”。

1.14、-jN forced in submake

warning: -jN forced in submake: disabling jobserver mode.

这一条告警和下条告警信息发生在:make 检测到递归的 make 调用时,可通信的子 make 进程出现并行处理的错误。递归执行的 make 的命令行参数中存在 -jN 参数( N 的值大于1),在有些情况下可能导致此错误,
例如:Makefile 中变量 MAKE 被赋值为 make –j2,并且递归调用的命令行中使用变量 MAKE。在这种情况下,被调用 make 进程不能和其它 make 进程进行通信,其只能简单的独立的并行处理两个任务。

1.15、jobserver unavailable

warning: jobserver unavailable: using -j1. Add '+' to parent make rule.

为了现实 make 进程之间的通信,上层 make 进程将传递信息给子 make 进程。在传递信息过程中可能存在这种情况,子 make 进程不是一个实际的 make 进程,而上层 make 却不能确定子进程是否是真实的 make 进程。
它只是将所有信息传递下去。上层 make 采用正常的算法来决定这些。当出现这种情况,子进程只会接受父进程传递的部分有用的信息。子进程会产生该警告信息,之后按照其内建的顺序方式进行处理。
 

<think>好的,我现在要解决用户关于Makefile错误输出的问题。首先,我需要回顾用户提供的引用内容,看看里面有没有相关的信息。用户提到了三个引用,分别涉及Makefile路径问题、CMake生成Makefile的关系,以及解决依赖跟踪错误的办法。 用户的问题是想查找Makefile中可能导致错误输出的原因及解决方法。我需要先列出常见Makefile错误类型,然后根据引用中的信息补充对应的解决方法。 首先想到的常见错误包括路径问题、依赖关系错误、命令执行失败、变量使用不当、语法错误等。引用[1]提到,如果不指定目标文件路径,生成的文件可能放在当前路径,导致链接时找不到依赖项。这时候需要检查文件路径是否正确,或者使用绝对路径。比如,用户可能在生成.o文件时,路径不对,导致链接错误。 然后,引用[3]提到了依赖跟踪的问题,比如在配置时出现错误,可能需要更改$MAKE变量为gmake,或者禁用依赖跟踪。这可能涉及到自动生成依赖文件时的错误,导致make过程中出现警告或错误信息。 另外,引用[2]提到CMake生成Makefile的结构,如果用户使用CMake,可能需要检查CMakeLists.txt是否正确,因为错误的CMake配置会导致生成的Makefile有问题。这时候需要确保CMakeLists中的源文件路径、目标设置正确。 接下来,我需要将这些问题分类,并给出对应的原因和解决方法。例如,路径问题可以对应引用[1]中的例子,依赖跟踪对应引用[3],而CMake相关的问题对应引用[2]。 还要考虑用户可能遇到的命令错误,比如命令前缺少Tab键,或者使用了不兼容的shell语法。变量未定义或拼写错误也是常见问题,需要检查变量是否正确展开。 此外,环境变量的问题,比如$MAKE的设置不正确,可能导致某些工具链无法正常工作,如引用[3]中提到的将MAKE设为gmake的情况。 在整理解决方案时,需要分步骤建议用户检查路径、依赖、命令语法、变量使用,以及可能的工具版本问题。同时,引用相关的引用内容来支持解决方法,比如在处理路径问题时引用[1],处理依赖跟踪时引用[3],处理CMake生成的Makefile时引用[2]。 可能还需要提到调试方法,比如使用make -n来查看命令执行顺序,或者添加调试输出检查变量值。这些方法能帮助用户定位具体错误的位置。 最后,确保回答结构清晰,每个问题点有对应的原因和解决方案,并正确标注引用来源。同时,生成的相关问题需要与Makefile错误相关,比如询问如何调试Makefile变量,或者如何处理依赖生成失败的问题。</think>### Makefile错误输出原因及解决方案分析 #### 一、常见错误类型与原因 1. **路径问题** - **原因**:当目标文件生成路径与依赖查找路径不一致时,会导致链接错误[^1]。例如`.o`文件默认生成在Makefile所在目录,但依赖关系需要特定子目录下的文件。 - **示例错误**:`No rule to make target 'comm/a.o', needed by 'target'` - **验证方法**:检查变量定义如`ob = $(patsubst %.cc, %.o, $(sources))`是否包含正确路径[^1] 2. **依赖关系错误** - **原因**:自动依赖跟踪功能(如GCC的`-MMD`选项)生成`.d`文件失败,或手动依赖声明不完整。 - **示例错误**:`something went wrong bootstrapping makefile fragments for automatic dependency tracking`[^3] 3. **命令执行失败** - **原因**:命令缺少Tab缩进、使用错误Shell语法或环境变量未定义。 - **示例错误**:`Missing separator. Stop`(缺少Tab缩进) 4. **变量使用错误** - **原因**:变量未正确定义或展开方式错误,例如`$(var:.c=.o)`与`$(patsubst %.c,%.o,$(var))`的差异。 #### 二、系统化解决方案 1. **路径问题修复** - **步骤**: (1) 显式声明输入/输出目录 ```makefile OBJ_DIR = ./build ob = $(patsubst %.cc,$(OBJ_DIR)/%.o,$(notdir $(sources))) ``` (2) 添加目录创建命令 ```makefile $(OBJ_DIR)/%.o: %.cc @mkdir -p $(@D) $(CXX) -c $< -o $@ ``` - **验证**:使用`make -n`预览生成路径 2. **依赖跟踪问题处理** - **方案选择**: | 方法 | 命令/配置 | 适用场景 | |---------------------------|-----------------------------------|-----------------------| | 切换make工具 | `export MAKE=gmake`[^3] | BSD系统环境 | | 禁用自动依赖跟踪 | `./configure --disable-dependency-tracking` | 紧急构建 | | 修复依赖生成规则 | 添加`-include $(DEP_FILES)` | 需要精确依赖关系 | 3. **语法错误调试流程** ```bash # 1. 检查基础语法 make -n # 空运行显示命令 # 2. 调试变量展开 $(info VAR=$(var)) # 插入Makefile打印变量 # 3. 检查环境变量 printenv | grep MAKE ``` #### 三、CMake相关错误 1. **生成规则错误** - **现象**:CMake生成的Makefile包含无效规则 - **根本原因**:CMakeLists.txt中未正确定义目标依赖关系[^2] - **修复示例**: ```cmake add_executable(MyApp comm/a.cc comm/b.cc # 显式声明所有源文件 ) target_include_directories(MyApp PRIVATE comm) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值