如何解决如何在Makefile中正确转义#字符?
我正在学习makefile文件,并且为了进行尝试,我在下面编写了一个包含以下文本的makefile文件:
blah: blah.o
cc blah.o -o blah
blah.o: blah.c
cc -c blah.c -o blah.o
blah.c:
echo '\#include <stdio.h> int main(){ return 0; }' > blah.c
clean:
rm -f blah.o blah.c blah
不幸的是,通过输入make
命令,我收到此错误:
blah.c:1:1: error: stray ‘\’ in program
\#include <stdio.h> int main(){ return 0; }
^
blah.c:1:2: error: stray ‘#’ in program
\#include <stdio.h> int main(){ return 0; }
^
blah.c:1:11: error: expected ‘=’,‘,’,‘;’,‘asm’ or ‘__attribute__’ before ‘<’ token
\#include <stdio.h> int main(){ return 0; }
^
Makefile:4: recipe for target 'blah.o' failed
make: *** [blah.o] Error 1
由于我正确地逃避了#字符(如我想的那样),所以我不太理解错误。
感谢您的帮助!
解决方法
问题是'
... '
字符串中不需要转义字符-它们都是文字的,包括 \
(也就是说,无法对'
... '
字符串中的字符进行转义)。因此,您会在blah.c中的\
之前得到一个文字#
,这可以防止C预处理程序将其视为指令。
删除\
,它应该可以正常工作。
这是一个shell问题,而不是makefile问题。如果在shell提示符下而不是从makefile运行命令,则会看到相同的行为:
$ echo '\#include <stdio.h> int main(){ return 0; }' > blah.c
$ cat blah.c
\#include <stdio.h> int main(){ return 0; }
这是简单的shell引用规则。如果在外壳程序中使用单引号,则外壳程序将不会解释单引号字符串内的任何内容。它将原样编写。所以,不要引用它:
blah.c:
echo '#include <stdio.h> int main(){ return 0; }' > blah.c
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。