C语言 如何在makefile中正确转义#字符?

m1m5dgzv  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(229)

我正在学习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

我真的不明白这个错误,因为我正确地转义了#字符(正如我所想的那样)。

d8tt03nd

d8tt03nd1#

问题是在'中不需要转义字符。'字符串。它们都是文字,* 包括 * \(即,没有任何方法可以转义'中的字符...'字符串)。所以你在blah. c中的#之前得到了一个文字\,这防止了C预处理器将其视为一个指令。
删除\,它应该工作正常。

7lrncoxx

7lrncoxx2#

这是一个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引用规则。如果在shell中使用单引号,那么shell将不会解释单引号字符串中的任何内容。它将按原样编写。所以,不要引用它:

blah.c:
    echo '#include <stdio.h>  int main(){ return 0; }' > blah.c

相关问题