我正在学习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
我真的不明白这个错误,因为我正确地转义了#字符(正如我所想的那样)。
2条答案
按热度按时间d8tt03nd1#
问题是在
'
中不需要转义字符。'
字符串。它们都是文字,* 包括 *\
(即,没有任何方法可以转义'
中的字符...'
字符串)。所以你在blah. c中的#
之前得到了一个文字\
,这防止了C预处理器将其视为一个指令。删除
\
,它应该工作正常。7lrncoxx2#
这是一个shell问题,而非makefile问题。如果在shell提示符下运行命令,而不是从makefile运行,您将看到相同的行为:
这是简单的shell引用规则。如果在shell中使用单引号,那么shell将不会解释单引号字符串中的任何内容。它将按原样编写。所以,不要引用它: