制定具有现有目标,现有先决条件但没有配方的规则

时间:2016-05-12 15:33:46

标签: c makefile

我正在查看net-snmp代码,我在snmplib本身的Makefile中发现了一些奇怪的东西。最后几千行只是这种形式的规则:

./dir_utils.lo: ../include/net-snmp/output_api.h

用于每个库对象和头文件。甚至那些未编译的,具体取决于在配置脚本中选择了哪些标志。

我查看了“制作”手册,但我没有找到这个确切的案例。可能(如5.9所述)他们这样做是为了排除在目标上调用隐式配方的可能性,但除此之外我不知道。

如果库被篡改,另一个原因可能是“中断”编译(删除项目中的任何标题导致makefile崩溃,因为它无法执行规则)。

这是一个有根据的猜测,但我想知道这背后的理论。我的意思是makefile已经构建了它必须构建的内容,为什么要以显式形式包含所有这些规则?

由于

1 个答案:

答案 0 :(得分:2)

正如我所料,Makefile是由./configure脚本生成的。 您感兴趣的所有行都是自动生成的依赖项。其实, 它们只是文件Makefile.depend的附加内容 目录,它是分发的一部分,是在援助下生成的 gcc提前。

所以,例如。

./dir_utils.lo: ../include/net-snmp/output_api.h

告诉make ./dir_utils.lo这个非常重要的事实 取决于../include/net-snmp/output_api.h。那么如果./dir_utils.lo 超过../include/net-snmp/output_api.hmake将重新制作 ./dir_utils.lo如果它有一些方法可以做到这一点,那就是它。

这是一个项目:

<强>的main.c

#include "hw.h"
#include <stdio.h>

int main(void)
{
    puts(HW);
    return 0;
}

<强> hw.h

#ifndef HW_H
#define HW_H
#define HW "Hello World"
#endif 

<强>生成文件

CC := gcc

.PHONY: all clean

all: hw

hw: main.o
    $(CC) -o $@ $<


clean:
    rm -f hw main.o

构建并运行它:

$ make && ./hw
gcc    -c -o main.o main.c
gcc -o hw main.o
Hello World

但是makefile中存在一个错误。它不知道main.o 取决于hw.h

$ touch hw.h
$ make
make: Nothing to be done for 'all'.

将该依赖项附加到makefile:

main.o: hw.h

并重试:

$ make
gcc    -c -o main.o main.c
gcc -o hw main.o

错误修复。

相关问题