2013-05-26 24 views
1

我写了简单的代码* make_test *来测试makefile的功能。文件夹结构如下: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. 生成文件其中包含以下内容:

    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 [email protected] $< 
    
    %.o: test/%.c $(DEPS) 
        @echo "Rule 2 was called" 
        $(CC) -o [email protected] $< 
    
    %.o: test/%.c $(DEPS) 
        @echo "Rule 3 was called" 
        $(CC) -o [email protected] $< 
    

注意,有测试/%。被刻意插入测试C语句。 没有测试文件夹。如果我让在主文件的变化,我输入make命令行中,我得到

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

我的问题是,我还没有添加-c标志的任何地方那么为什么它出现在输出?不应该存在“Nothing to do”输出,因为不存在依赖关系(test /%。c)或更改(include/maths.h)?

感谢,

回答

5

制作包含了大量的内置的规则。你可以通过运行这样的东西来看到它们:make -p -f /dev/null。其中一条规则正在用于编译您的代码,并且其中包含-c标志。

为什么使用内置规则?因为你定义的规则不匹配。他们告诉如何从test子目录中的.c文件构建.o文件。但make_test.c文件不在test子目录中,所以这些规则不能由make使用。因此,查看其内置规则以找到一个规则,该规则可以在同一个目录中从.c构建一个.o,并找到一个并使用它。

如果您将make_test.c文件移动到test子目录中,则将使用您的规则。

但是,请注意,make在此处是正确的:如果要输出.o输出,则必须将-c标志添加到编译器调用中。你的规则不会创建一个目标文件,它们会创建一个名为xxx.o的可执行程序,这很令人困惑。