Makefile:xxx: recipe for target xxx failed +【顺带搞懂了】如何忽略makefile执行过程中的某些命令的错误而得以继续运行
来源:互联网 发布:郭德纲才学 知乎 编辑:程序博客网 时间:2024/06/06 04:16
问题】
在Cygwin中,执行makefile,其中调用hhc从hhp文件生成chm文件。
结果最后一步出错:
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源码为:
$(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 中兩個特別字元,可以加在要執行的命令之前:
-
:make 會忽略命令的錯誤。
- 如果希望產生一個目錄,但希望忽略錯誤,可能是因為該目錄已經存在。
-mkdir /usr/local/repository
- 如果希望清除目標檔案,但希望忽略錯誤,可能是因為該檔案不存在。
clean: -rm main.o 2.o 3.o
@
:make 不會在標準輸出上,顯示要執行的命令。
- 判斷式 if 起始為符號
@
,讓 make 在執行該法則時,停止印出標準輸出的文字。install: myapp @if [ -d $(INSTDIR) ]; \ then \ ...;\ fi
即,对应的命令前面加上一个减号’-’,就可以忽略该命令的错误了,后续的命令就可以继续执行了。
所以,最后用:
- hhc $(OUTPUT_DIR_CHM)
/htmlhelp
.hhp
就可以实现所要的效果了。这样,makefile执行过程就不会被hhc的错误所打断了。
虽然此处搞定了问题,但是具体错误的根本原因,还是不清楚,所以想尽量搞清楚为啥错了。
然后,关于返回值的事情,最后用:
echo
"---before hhc"
# here use '-' to ignore the hhc error
- hhc $(OUTPUT_DIR_CHM)
/htmlhelp
.hhp
echo
$?
echo
"+++after hhc"
测试到的结果为:
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
结果后来经过如下折腾:
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,以为是程序执行错了呢,所以报错:
Makefile:131: recipe
for
target `..
/output/htmlhelp/MPEG_VBR
.chm' failed
并且说是error 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即使出现(不严重的)错误,也可以继续运行。
- Makefile:xxx: recipe for target xxx failed +【顺带搞懂了】如何忽略makefile执行过程中的某些命令的错误而得以继续运行
- Makefile:xxx: recipe for target xxx failed +【顺带搞懂了】如何忽略makefile执行过程中的某些命令的错误而得以继续运行
- 很感谢这篇文张【已解决】Makefile:xxx: recipe for target xxx failed +【顺带搞懂了】如何忽略makefile执行过程中的某些命令的错误而得以继续运行
- Makefile:xxx: recipe for target xxx failed +如何忽略makefile执行过程中的某些命令的错误而得以继续运行
- makefile老是报“recipe for target xxx”错误,不妨先看看编码是否正确
- 【caffe install】recipe for target 'xxx' failed
- Makefile:944: recipe for target 'drivers' failed
- makefile:5: recipe for target ' ' failed
- /opt/linux/linux-3.5/scripts/kconfig/Makefile:21: recipe for target 'menuconfig' failed错误
- 交叉编译openssh出现错误Makefile:548: recipe for target 'install_sw' failed
- ERROR: Makefile:1385: recipe for target 'checkarmreloc' failed
- Makefile:2203: recipe for target 's-attrtab' failed
- go-ethereum 1.6 Makefile:15: recipe for target 'geth' failed
- Makefile执行过程中出错:make: *** No rule to make target ` ‘, needed by xxx. Stop.
- Makefile执行过程中出错:make: *** No rule to make target ` ‘, needed by xxx. Stop.
- 采用MingW编译OPENCV,出现recipe for target xxx/can't create precompiled header错误解决方法
- 编译BusyBox时scripts/Makefile.build:197: recipe for target 'loginutils/passwd.o' failed
- Makefile:588: recipe for target '.build_release/cuda/src/caffe/layers/softmax_loss_layer.o' failed
- 关于linux的学习分享
- 动态规划算法
- java对象池commons-pool-1.6详解(三)
- 494. Target Sum
- Android 6开发秘籍 第5版.pdf 免费下载
- Makefile:xxx: recipe for target xxx failed +【顺带搞懂了】如何忽略makefile执行过程中的某些命令的错误而得以继续运行
- Beginning Ractive.js-Apress(2017).pdf 英文原版 免费下载
- java包装器类拆装箱特别注意的问题
- 红黑树
- 降维和度量学习
- Git指令整理
- Build Android-Based Smart Applications (2018).pdf 英文原版 免费下载
- iOS @property (copy) NSMutableArray *array;用copy、strong出现问题
- 数值优化方法