makefile自动执行操作

时间:2013-05-26 13:56:35

标签: c makefile gnu-make

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

  1. 包含 maths.h

    的文件夹
    float add(float a, float b) 
    {
        return a+b;
    }
    
  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;
     }
    
  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 $@ $<
    
  4. 请注意,有一些test /%。c语句是故意插入进行测试的。 没有测试文件夹。如果我在主文件中进行更改并在命令行上输入make,我会得到

        gcc -Wall -g -I.    -c -o make_test.o make_test.c
    

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

    谢谢,

1 个答案:

答案 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,这非常令人困惑。