1

我编写了简单的代码 *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 $@ $<
    

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

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

我的问题是我没有在任何地方添加 -c 标志,那么为什么它会出现在输出中?不应该有一个“无事可做”的输出,因为不存在依赖关系(test/%.c)或改变(include/maths.h)?

谢谢,

4

1 回答 1

5

Make 包含大量的内置规则。您可以通过运行以下命令来查看它们make -p -f /dev/null:这些规则之一用于编译您的代码,它包含-c标志。

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

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

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

于 2013-05-26T14:50:15.800 回答