我查看了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已修复。