我编写了简单的代码* make_test *来测试makefile的功能。文件夹结构如下:
包含 maths.h
的文件夹float add(float a, float b)
{
return a+b;
}
主文件包含以下代码:
# include <stdio.h>
# include <include/maths.h>
int main(int argc, char** argv)
{
float a=1;
float b=4;
printf("%f + %f = %f\n", a, b, add(a, b));
return 0;
}
包含以下内容的makefile:
IDIR = -I.
DEPS = ./include/maths.h
CC= gcc -Wall -g $(IDIR)
program: make_test.o
%.o: test/%.c $(DEPS)
@echo "Rule 1 was called"
$(CC) -o $@ $<
%.o: test/%.c $(DEPS)
@echo "Rule 2 was called"
$(CC) -o $@ $<
%.o: test/%.c $(DEPS)
@echo "Rule 3 was called"
$(CC) -o $@ $<
请注意,有一些test /%。c语句是故意插入进行测试的。 没有测试文件夹。如果我在主文件中进行更改并在命令行上输入make,我会得到
gcc -Wall -g -I. -c -o make_test.o make_test.c
我的问题是我没有在任何地方添加-c标志然后它出现在输出中?不应该有“无所事事”输出,因为不存在依赖(test /%。c)或更改(include / maths.h)?
谢谢,
答案 0 :(得分:5)
Make包含大量内置规则。您可以通过运行以下内容来查看它们:make -p -f /dev/null
。其中一条规则用于编译代码,它包含-c
标志。
为什么要使用内置规则?因为您定义的规则不匹配。他们告诉如何从.o
子目录中的.c
文件构建test
文件。但是make_test.c
文件不在test
子目录中,因此make不能使用这些规则。因此,查看其内置规则以查找可以在同一目录中从.o
构建.c
的规则,并找到一个并使用该规则。
如果您将make_test.c
文件移至test
子目录,则会使用您的规则。
但是,请注意,make在这里是正确的:如果要输出-c
,则必须将.o
标志添加到编译器调用中。你的规则不会创建一个目标文件,他们会创建一个名为xxx.o
的exectuable,这非常令人困惑。