Makefile:xxx: recipe for target xxx failed +【顺带搞懂了】如何忽略makefile执行过程中的某些命令的错误而得以继续运行

Cygwin中Makefile忽略错误
本文介绍在Cygwin环境下,通过Makefile生成CHM文件时遇到的错误及解决方法。主要问题是Windows下的hhc工具返回1,被误认为错误。解决方案是在Makefile中hhc命令前加减号来忽略此类错误。

http://www.crifan.com/make_makefile_recipe_for_target_failed_omit_error_while_executing_makefile/

在Cygwin中,执行makefile,其中调用hhc从hhp文件生成chm文件。

结果最后一步出错:

?
1
2
3
4
5
6
7
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
make  chm
...
Created e:\Dev_Root\docbook\dev\books\VBR\output\htmlhelp\MPEG_VBR.chm, 181,978 bytes
Compression decreased  file  by 70,718 bytes.
Makefile:131: recipe  for  target `.. /output/htmlhelp/MPEG_VBR .chm' failed
make : *** [.. /output/htmlhelp/MPEG_VBR .chm] Error 1

但是很奇怪的是,对应的所需要的文件MPEG_VBR.chm,都是已经成功生成的了,但是此处还是出错。

对应的makefile源码为:

?
100
101
102
103
104
105
106
107
108
109
$(OUTPUT_FILE_CHM):$(OUTPUT_FILE_HTMLHELP) $(OUTPUT_DIR_CHM) /htmlhelp .hhp $(OUTPUT_DIR_CHM) /toc .hhc
     iconv -f UTF-8 -t GB18030 < $(OUTPUT_DIR_CHM) /htmlhelp .hhp > $(OUTPUT_DIR_CHM) /htmlhelp_gb18030 .hhp
     mv  $(OUTPUT_DIR_CHM) /htmlhelp_gb18030 .hhp $(OUTPUT_DIR_CHM) /htmlhelp .hhp
     iconv -f UTF-8 -t GB18030 < $(OUTPUT_DIR_CHM) /toc .hhc > $(OUTPUT_DIR_CHM) /toc_gb18030 .hhc
     mv  $(OUTPUT_DIR_CHM) /toc_gb18030 .hhc $(OUTPUT_DIR_CHM) /toc .hhc
     echo  "---before hhc"
     hhc $(OUTPUT_DIR_CHM) /htmlhelp .hhp
     echo  "+++after hhc"
 
chm: clean_chm $(OUTPUT_FILE_CHM)

【解决过程】

1.以为是上面的iconv中的小于号导致出错的呢,结果去掉小于号后,还是同样错误。

2.然后添加了上述的echo命令,结果是hhc后面那句:+++after hhc,是没有显示出来,证实了hhc命令本身执行结果就是错误的,所以hhc执行出错后,返回到makefile,然后makefile报上述recipe for target  failed的错误。

3.但是很奇怪是,上述的hhc那行命令,单独去cygwin的命令中执行,却是没有显示啥错误的。估计是返回值错误,也没有任何人捕获,所以也不知道错误吧。

4。然后想要去找办法,去从makefile中获得上次命令行执行的结果,结果却始终由于无法执行hhc的后面那句,而无从获得。

5.然后就想到,本身hhc命令虽然出错,但是目的已经达到,已经可以正常生成chm了,所以,此处想要想办法去在makefile执行过程中,忽略此error即可。

然后就找到很多的资料,比如这里

还有一个全局的办法是,给make加上“-i”或是“–ignore-errors”参数,那么,Makefile中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。

还有一个要提一下的make的参数的是“-k”或是“–keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。

结果都是说如何忽略整个的错误,所以不符合此处的需求。

后来终于找到了:makefile 的變數,其中谈到了:

makefile 中兩個特別字元,可以加在要執行的命令之前:

  1. - :make 會忽略命令的錯誤
    1. 如果希望產生一個目錄,但希望忽略錯誤,可能是因為該目錄已經存在。
      -mkdir /usr/local/repository



    2. 如果希望清除目標檔案,但希望忽略錯誤,可能是因為該檔案不存在。
      clean:
         -rm main.o 2.o 3.o



  2. @ :make 不會在標準輸出上,顯示要執行的命令。
    1. 判斷式 if 起始為符號 @,讓 make 在執行該法則時,停止印出標準輸出的文字。
      install: myapp
         @if [ -d $(INSTDIR) ]; \
          then \
            ...;\
         fi

即,对应的命令前面加上一个减号’-’,就可以忽略该命令的错误了,后续的命令就可以继续执行了。

所以,最后用:

?
1
- hhc $(OUTPUT_DIR_CHM) /htmlhelp .hhp

就可以实现所要的效果了。这样,makefile执行过程就不会被hhc的错误所打断了。

虽然此处搞定了问题,但是具体错误的根本原因,还是不清楚,所以想尽量搞清楚为啥错了。

然后,关于返回值的事情,最后用:

?
1
2
3
4
5
echo  "---before hhc"
# here use '-' to ignore the hhc error
- hhc $(OUTPUT_DIR_CHM) /htmlhelp .hhp
echo  $?
echo  "+++after hhc"

测试到的结果为:

?
1
2
3
4
5
6
Makefile:131: recipe  for  target `.. /output/htmlhelp/MPEG_VBR .chm' failed
make : [.. /output/htmlhelp/MPEG_VBR .chm] Error 1 (ignored)
echo  .. /output/htmlhelp/MPEG_VBR .html .. /output/htmlhelp/htmlhelp .hhp .. /output/htmlhelp/toc .hhc
.. /output/htmlhelp/MPEG_VBR .html .. /output/htmlhelp/htmlhelp .hhp .. /output/htmlhelp/toc .hhc
echo  "+++after hhc"
+++after hhc

看起来好像是hhc返回的值是:

../output/htmlhelp/MPEG_VBR.html ../output/htmlhelp/htmlhelp.hhp ../output/htmlhelp/toc.hhc ../output/htmlhelp/MPEG_VBR.html ../output/htmlhelp/htmlhelp.hhp ../output/htmlhelp/toc.hhc

结果后来经过如下折腾:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
$ iconv1Retcode=`iconv -f UTF-8 -t GB18030 < .. /output/htmlhelp/htmlhelp .hhp > .. /output/htmlhelp/htmlhelp_gb18030 .hhp`
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
echo  $iconv1Retcode
 
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
$ mv1Retcode=` mv  .. /output/htmlhelp/htmlhelp_gb18030 .hhp .. /output/htmlhelp/htmlhelp .hhp`
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
echo  $mv1Retcode
 
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
echo  $?
0
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
$ iconv -f UTF-8 -t GB18030 < .. /output/htmlhelp/toc .hhc > .. /output/htmlhelp/toc_gb18030 .hhc
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
echo  $?
0
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
mv  .. /output/htmlhelp/toc_gb18030 .hhc .. /output/htmlhelp/toc .hhc
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
echo  $?
0
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
$ hhc .. /output/htmlhelp/htmlhelp .hhp
Microsoft HTML Help Compiler 4.74.8702
 
Compiling e:\Dev_Root\docbook\dev\books\VBR\output\htmlhelp\MPEG_VBR.chm
 
index.html
……
Created e:\Dev_Root\docbook\dev\books\VBR\output\htmlhelp\MPEG_VBR.chm, 181,978 bytes
Compression decreased  file  by 70,718 bytes.
 
Administrator@K470 /cygdrive/e/Dev_Root/docbook/dev/books/VBR/src
echo  $?
1

证实了,原来是linux下面的那些命令,比如iconv,mv等,执行结果的,如果是没有错误的,会返回0,表示正常的,而此处hhc是windows下面的工具,其返回1表示执行结果正常,导致了makefile收到1,以为是程序执行错了呢,所以报错:

?
1
Makefile:131: recipe  for  target `.. /output/htmlhelp/MPEG_VBR .chm' failed

并且说是error 1:

?
1
make : [.. /output/htmlhelp/MPEG_VBR .chm] Error 1 (ignored)

【总结】

此处现象是makefile执行过程中出线recipe for target xxx failed的错误,导致执行过程中断。

直接的原因是由于hhc命令执行结果有误。

而根本而原因是,hhc的命令,是属于微软的(windows下)的工具,此处经过cygwin调用而已,然后其返回值是1,(应该是)表明结果执行的是正确的,结果却由于linux下的makefile误以为错误了。

因为Linux下的一般的程序都是返回值为0表示程序执行是正常的。

所以,还是所用的工具属于不同平台,而导致的不完全兼容。

此处的解决办法是,在对应hhc命令前面加上一个减号,表示makefile执行该命令时候,即使该命令出错,也可以忽略该命令的错误,可以继续执行余下的其他命令,使得makefile能继续正常执行。

所以,其他人如果也是遇到类似问题:

一是要小心,是不是使用了不同平台的工具而导致的不兼容问题

二是可以通过makefile中给相关命令添加减号以(故意地)忽略某些命令的(可能出现的)错误,而使得makefile即使出现(不严重的)错误,也可以继续运行。

<think>首先,用户的问题是关于解决Makefile中第210行出现的错误:"recipe for target 'xxx.o' failed"。用户提供了几个引用,我需要参考这些引用来给出解决方案。 回顾引用内容: - 引用[1]: 描述了一个问题,当程序返回非零值时,Makefile会报错。解决方法是确保程序返回0。 - 引用[2]: 提到了类似的问题,可能由于找不到头文件或路径问题。 - 引用[3]: 在交叉编译中报错,错误recipe for target 'xxx.o' failed。 - 引用[4]: 解释了问题可能由编译警告被视为错误引起,特别是在高版本GCC中。解决方法是修改gcc-wrapper.py文件。 用户的具体错误在第210行,目标'xxx.o'失败。我需要综合这些信息来提供解决方案。 关键点: - "recipe for target 'xxx.o' failed" 错误通常表示编译目标文件时出错。 - 可能原因: 1. 源代码错误(如语法错误)。 2. 依赖问题(如头文件缺失)。 3. 工具链问题(如编译器路径不正确)。 4. 路径或文件权限问题。 5. 编译警告被视为错误(尤其是在使用高版本GCC时)。 从引用[4],一个重要原因是高版本GCC将警告视为错误,可以通过修改gcc-wrapper.py或其他脚本解决。 用户提到错误在第210行,所以可能Makefile的第210行是编译命令。我需要建议用户查看命令的输出,找出具体错误。 步骤建议: 1. **检查编译输出**:运行make命令时,找出导致失败的具体错误消息。"recipe for target failed" 通常后面跟着更详细的错误。 2. **检查源代码**:确保源代码没有错误,特别是针对'xxx.o'文件对应的源文件。 3. **检查依赖**:确保所有头文件和库文件都存在。 4. **检查路径**:确认文件路径正确,没有空格或特殊字符。 5. **检查返回值**:如果编译命令运行的程序返回非零,Make会失败(如引用[1])。 6. **检查编译器警告**:如果使用高版本GCC,警告可能被视为错误(引用[4])。 7. **查看Makefile行**:具体看第210行的命令,理解它在做什么。 可能的解决方案: - 修复源代码错误。 - 添加缺失的头文件路径。 - 确保编译器路径正确。 - 如果警告是问题,尝试添加-Wno-error标志或修改脚本。 - 检查文件权限。 结构回答: - 作为AI助手,我需要清晰、步骤化地回答。 - 从引用中提取关键点。 - 最后生成相关问题。 回答结构: 1. **解释错误**:简要解释"recipe for target failed"错误的原因。 2. **诊断步骤**:提供步骤帮助用户诊断问题。 3. **解决方案**:基于常见原因给出解决方法。 4. **参考引用**:自然地融入引用。 5. **生成相关问题**:结束时添加相关问题。 生成相关问题: - 例如: 1. 如何处理Makefile中的编译路径问题? 2. 如何防止GCC将警告视为错误? 3. Makefile中如何设置返回值为0? 确保使用中文回答。 最终回答大纲: - 引言:确认问题。 - 步骤1:检查错误输出。 - 步骤2:检查源代码和依赖。 - 步骤3:检查路径和权限。 - 步骤4:考虑编译器警告。 - 步骤5:修改Makefile(如果需要)。 - 结论。 - 相关问题。 </think>基于您的查询,针对 Makefile 第 210 行出现 `recipe for target 'xxx.o' failed` 错误,我将为您提供系统化的解决方法。这个错误通常表示在编译目标文件时发生了失败,可能源于源代码错误、依赖缺失、路径问题、编译器配置或返回值异常等。我会结合您提供的引用内容(特别是引用[1], [^1] 关于返回值问题;引用[4], [^4] 关于编译器警告被视作错误)来说明解决方案。**关键是要先诊断具体错误原因**,因为错误信息是表面现象,真实问题往往隐藏在编译输出中。 ### 解决步骤(按顺序排查) #### 1. **查看完整编译输出,定位具体错误原因** - 运行 `make` 命令时,添加 `-d` 或 `--debug` 选项获取详细日志: ```bash make -d 2>&1 | tee make.log # 输出重定向到文件便于分析 ``` - 重点检查第 210 行命令附近的错误消息:`recipe for target 'xxx.o' failed` 通常是**结果**而非原因。真实的错误可能在上面的行中显示,例如: - 源代码语法错误(如缺少分号、不匹配的括号)。 - 头文件找不到(如 `fatal error: xxx.h: No such file or directory`)。 - 编译器路径问题(如 `Error 127` 表示命令未找到)。 - **为什么重要?** 引用[2], [^2] 提到类似错误常因路径或依赖缺失引起,而引用[4], [^4] 强调错误可能由前置的警告触发(例如 GCC 高版本将警告视为错误)。 #### 2. **检查源代码和相关依赖** - **修复源文件错误**: - 确保 `xxx.o` 对应的源文件(如 `xxx.c` 或 `xxx.cpp`)无语法错误。使用编译器直接测试: ```bash gcc -c xxx.c -o xxx.o # 手动编译,看是否报错 ``` - 如果出现返回值问题(如引用[1], [^1] 所述),确保 `main` 函数返回 0(非零返回值会使 Makefile 失败)。 - **验证头文件和库依赖**: - 检查 Makefile 第 210 行是否指定了正确的头文件路径(如 `-I/path/to/headers`)。 - 确认所有依赖文件存在:使用 `ls` 或 `find` 检查文件路径是否有效。引用[2], [^2] 报告中,路径不匹配是常见原因。 #### 3. **检查文件路径和权限** - **路径问题**: - 确保路径无空格或特殊字符:如果路径包含空格,用引号包裹(如 `./"my dir"/xxx.o`)。 - 引用[4], [^4] 提到路径错误可能导致失败,检查 Makefile 第 210 行的文件路径是否正确。 - **权限问题**: - 运行 `ls -l xxx.o` 查看文件权限。若无写入权限,使用: ```bash chmod +w xxx.c # 添加写权限 ``` #### 4. **处理编译器警告和版本问题** - 如果编译输出显示警告(如 `warning: ...`),可能被视作错误触发失败(尤其在 GCC 4.8+ 版本)。引用[4], [^4] 详细说明此问题: - **临时修复**:在 Makefile 中添加标志忽略警告: ```makefile CFLAGS += -Wno-error # 忽略所有警告导致的错误 ``` 或针对特定警告: ```makefile CFLAGS += -Wno-error=unused-variable # 忽略未使用变量警告 ``` - **永久修复**:如果涉及脚本(如 `gcc-wrapper.py`),按引用[4] 建议注释掉警告处理行: ```python # 修改脚本文件(如 kernel/msm-3.18/scripts/gcc-wrapper.py) # 找到并注释: # interpret_warning(line) ``` #### 5. **检查工具链和返回值** - **编译器路径**:确保交叉编译工具链配置正确(引用[3], [^3]): ```bash which gcc # 确认编译器路径 ``` 在 Makefile 中显式设置路径: ```makefile CC = /path/to/gcc # 第 210 行前添加 ``` - **返回值问题**:如果命令返回非零值(如引用[1], [^1]),在 Makefile 命令后添加 `|| true` 强制返回 0: ```makefile # 第 210 行示例修改 xxx.o: xxx.c $(CC) -c $< -o $@ || true # 忽略返回值错误 ``` #### 6. **隔离测试和调试** - 简化测试:创建一个最小化示例(类似引用[1], [^1] 的 `test.c`),检查 Makefile 是否独立工作。 - 使用版本控制:如果 Makefile 是从源码获取(引用[4], [^4]),尝试回退到已知正常的版本。 ### 总结建议 - **首选策略**:90% 的此类错误可通过步骤 1 的日志分析解决。优先查看编译输出,定位具体错误后再针对性修复。 - **如果仍失败**:提供完整的错误日志(运行 `make clean` 后重试),我可以帮您进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值