.h文件为什么文件未编译

.h文件为什么文件未编译,第1张

我们来看一下 Makefile 中的这个规则:

%.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、编译参数导致优化方式不一致竖销

其他:如果程序可以运行,说明一定全部都编译了。

具体的问题,你可以把全部则野代码都给我,我帮你看看。这么简单说有时很难,毕竟写程序考虑到编译器和硬件缺陷的人现在很少。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12144610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存