在Cygwin中使用make -j命令编译时持续报错是什么原因?
!error Hello World>
/bin/sh: -c: line 0: syntax error near unexpected token 'newline'
make: ***[makefile:404: ] Error 1
报错触发原因
- Makefile存在非法字符或语法错误(最高概率):报错中出现的
!error Hello World>是不符合Makefile语法的无效内容,这类内容会被make直接传递给shell执行,shell遇到未闭合的>以及非法开头的!就会触发换行符相关的语法错误。另外如果是在Windows环境下编辑的Makefile,可能携带了Cygwin shell无法识别的CRLF换行符,也会被判定为多余的换行符号触发报错,可优先定位到Makefile的第404行检查上下文内容。 - 并行编译依赖缺失:使用
make -j并行编译时,如果对应target的依赖关系声明不完整,会出现变量还未完成赋值、依赖文件还未生成的情况下就提前执行编译命令,最终生成的shell命令不完整触发语法错误。 - shell兼容性问题:Cygwin环境下
make默认调用/bin/sh执行命令,如果Makefile中使用了仅兼容bash的语法,或是/bin/sh软链接指向了不兼容的shell实现,也会触发这类语法报错。 - 特殊字符未转义:如果Makefile中定义的路径、变量包含
!、>、空格这类特殊字符且没有正确转义,会被shell识别为控制字符,引发语法解析错误。
解决方法
- 打开Makefile定位到第404行,删除
!error Hello World>这类调试残留的无效代码,检查该行及附近有没有未闭合的引号、括号、重定向符号。如果是换行符格式问题,执行dos2unix Makefile转换文件换行格式为Cygwin兼容的LF格式。 - 先尝试去掉
-j参数执行单线程编译,如果单线程编译正常,说明是并行编译的依赖问题,需要补全第404行对应target的依赖声明,避免命令提前执行。 - 在Makefile开头添加
SHELL := /bin/bash,显式指定用bash执行命令,规避/bin/sh的兼容性问题。 - 检查Makefile中所有自定义路径、变量的定义,包含特殊字符的内容用引号包裹,或是在特殊字符前加
\转义。
内容的提问来源于stack exchange,提问作者Nancy Drew
相关产品推荐
相关产品推荐

