c-制定有现有目标、现有先决条件但没有配方的规则

  • 本文关键字:规则 目标 先决条件 c makefile
  • 更新时间 :
  • 英文 :


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

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

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

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

另一个原因可能是,如果库被篡改,则会"中断"编译(删除项目中的任何头实际上都会导致makefile崩溃,因为它无法执行规则)。

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

感谢

正如我所期望的,Makefile是由./configure脚本生成的。所有您感兴趣的行都是自动生成的依赖项。事实上它们只是文件CCD_ 3的附加内容目录,它是发行版的一部分,是在帮助下生成的提前完成gcc。

因此,例如

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

只是通知make ./dir_utils.lo取决于CCD_ 6。那么如果./dir_utils.lo../include/net-snmp/output_api.h旧,make将重新制作./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'.

将该依赖项附加到生成文件:

main.o: hw.h

并重试:

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

Bug已修复。

相关内容

  • 没有找到相关文章

最新更新