Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 为什么可以';这个文件不行吗?_Makefile_Gnu Make - Fatal编程技术网

Makefile 为什么可以';这个文件不行吗?

Makefile 为什么可以';这个文件不行吗?,makefile,gnu-make,Makefile,Gnu Make,我使用自动变量($@,$^)和模式(%)编写了以下makefile,但它不能与gnu make一起使用: TARGET = edit SRCS = $(wildcard *.c) OBJS = $(SRCS:%.c=%.o) $(TARGET) : $(OBJS) gcc $^ -o $(TARGET) %.o : %.c gcc $< -c $@ 我对自动变量和模式规则非常困惑,如何准确地使用它们?他们之间有什么关系吗?你的规则是错误的。应该是: %.o : %.c

我使用自动变量(
$@,$^
)和模式(
%
)编写了以下makefile,但它不能与gnu make一起使用:

TARGET = edit
SRCS = $(wildcard *.c)
OBJS = $(SRCS:%.c=%.o)
$(TARGET) : $(OBJS)
    gcc $^ -o $(TARGET)
%.o : %.c
    gcc $< -c $@

我对
自动变量
模式规则
非常困惑,如何准确地使用它们?他们之间有什么关系吗?

你的规则是错误的。应该是:

%.o : %.c
    gcc -c $< -o $@
%.o:%.c
gcc-c$<-o$@

如果您不是专家,那么传统的makefile语法与所有这些符号都会相互影响。在中,您可以使用自我解释的长名称(第二行不需要以选项卡开头):

至于你的问题:虽然这些变量在所有规则中都很有用,可以避免冗余,但在模式规则中它们是必不可少的。否则,您将如何知道当前正在编译的输入文件中的哪一个


还有很多事情要做。除了做GNU make所能做的几乎所有事情外,还有很多有用的事情,您甚至可以通过一些Perl编程来扩展make文件。

谢谢,我太粗心了!但是为什么我看不出用
gcc-c$<-o$@
替换
gcc-c$<-o$@
时有什么不同?我不确定我是否理解您的回答。你仍然看到一个错误?你能用新的错误输出更新你的问题吗?你希望看到什么不同?我想你可能把你说的话弄混了。我想你的意思是“当我用
gcc-c$^-o$@
替换
gcc-c$^-o$@
时,为什么我看不出有什么不同?”因此,不要看第一个依赖项,而是看所有依赖项。答案是每个
.o
文件只有一个依赖项:它来自的
.c
文件。所以
$^
$
%.o : %.c
    gcc -c $< -o $@
%.o : %.c
    gcc -c $(input) -o $(ouptut)