我正在查看net-snmp代码,我在snmplib本身的Makefile中发现了一些奇怪的东西。最后几千行只是这种形式的规则:
./dir_utils.lo: ../include/net-snmp/output_api.h
用于每个库对象和头文件。甚至那些未编译的,具体取决于在配置脚本中选择了哪些标志。
我查看了“制作”手册,但我没有找到这个确切的案例。可能(如5.9所述)他们这样做是为了排除在目标上调用隐式配方的可能性,但除此之外我不知道。
如果库被篡改,另一个原因可能是“中断”编译(删除项目中的任何标题导致makefile崩溃,因为它无法执行规则)。
这是一个有根据的猜测,但我想知道这背后的理论。我的意思是makefile已经构建了它必须构建的内容,为什么要以显式形式包含所有这些规则?
由于
答案 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.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'.
将该依赖项附加到makefile:
main.o: hw.h
并重试:
$ make
gcc -c -o main.o main.c
gcc -o hw main.o
错误修复。