makefile自动执行操作

Joh*_*ohn 1 c makefile gnu-make

我编写了简单的代码*make_test*来测试makefile的功能.文件夹结构如下:

  1. include文件夹包含maths.h

    float add(float a, float b) 
    {
        return a+b;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 主文件包含以下代码:

    # 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;
     }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 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 $@ $<
    
    Run Code Online (Sandbox Code Playgroud)

请注意,有一些test /%.c语句是故意插入进行测试的.没有测试文件夹.如果我在主文件中进行更改并在命令行上输入make,我会得到

    gcc -Wall -g -I.    -c -o make_test.o make_test.c
Run Code Online (Sandbox Code Playgroud)

我的问题是我没有在任何地方添加-c标志然后为什么它出现在输出?不应该有"无所事事"输出,因为不存在依赖(test /%.c)或更改(include/maths.h)?

谢谢,

Mad*_*ist 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输出,必须将标志添加到编译器调用中.你的规则不会创建一个目标文件,他们会创建一个exectuable命名xxx.o,这是非常令人困惑的.