%.o: %.c
gcc $<-c -o $@
目标文件 main.o,只是依赖了 main.c 文件,并没有依赖 hello.h 文件。
make 的执行规则是:只有目标文件不存在,或者依赖文件比目标文件更新的时候,才会执行编译指令。
因此,虽然悄袜 hello.h 被修改了,但是它并不是目标文陵郑件 main.o 的依赖。
make 发现:main.o 在当前目录中是已经存在的,并且它比 main.c 更新,因此不会重新编译 main.o。启汪激
所以即使 hello.h 被修改了,也不会起作用,因为 make 压根就不把 hello.h 当做 main.o 的依赖!
注意:所有的 *** 作过程没有执行 clean *** 作。
既然知道了原因,那就好办了,我们手动把头文件 hello.h 加到依赖中,不就可以了吗?!
把 Makefile 中最后面几句修改成下面这样,HEADERS := hello.h
%.o: %.c ${HEADERS}
gcc $<-c -o $@
也就是把 .h 文件,也加入到 .o 文件的依赖中,这样的话,每次修改 .h 文件后,再执行 make 指令时,就可以重新编译 .o 目标文件了。
make是根灶祥据依赖文件的时间戳来决定要不要重新编译的。在:object: deplist
# actions
中,可以把头文件加进deplist,这样修改头文件后,make就会重新编译隐枯搏了。
单纯地修改文件,而不设置Makefile,则make程序不知道你这个文件对应哪个编译目标败判,自然无法判断要重新编译哪个目标了。
应该是没有关系的,你把编译步骤写清楚,编译结果和参数说清楚。根据我对编译器的理解,这种情况不会发生,最大可能性有几种:
1、你的代码本身就很小,你没有注意到,(一个20K行的程序,编译出来只有不到15K是十分正常的)因为程序里余盯游往往包括注释、空行等。
2、程序的体积往往取决于变量初始化,例如static int i[1000]={0}这会产生大量的无效代码。
3、其他编译器代码体积问题。
4、编译参数导致优化方式不一致竖销
其他:如果程序可以运行,说明一定全部都编译了。
具体的问题,你可以把全部则野代码都给我,我帮你看看。这么简单说有时很难,毕竟写程序考虑到编译器和硬件缺陷的人现在很少。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)