每个诡异错误的背后。都隐藏着一个低级错误。真理重新得到验证。正如只所以会有这篇博文也是如此,拿别人的一个uboot源码直接过来编译,操作如下:

顶层Makefile已经生成完毕

#make clean
 
#make mini2440_config
 
#make


出现错误如下:


没有规则可以创建目标vexpress 没有规则可以创建目标distclean_没有规则可以创建XXX需要的目标XXX问



给我的第一感觉分析,我该清的都清了,前面不是已经做了makeclean操作了么?现在是不是Makefile出现了问题,我该源码具备的编译环境,我的源码需要放在特定的路径下编译,种种答案一一尝试,而该问题给我的回应是无止无休的***没有规则可以创建***类似的错误。所有的方法用尽,最后来了个大扫除,make distclean,再makemini2440_config,make,编译竟然一次性通过,没有任何问题。截图如下:


没有规则可以创建目标vexpress 没有规则可以创建目标distclean_没有规则可以创建XXX_02



对于问题不能知其然而不知其所以然,毛主席教导我们要有实事求是的作风,本人也一直秉着必须要知其然也知其所以然的态度,下面让我们来探究一下,为什么makedistclean可以解决这个问题。



首先我们不得不提到: makeclean 和make distclean的区别:


make clean仅仅是清除之前编译的可执行文件及配置文件。


而make distclean要清除所有生成的文件
makedistclean类似makeclean,但同时也将configure生成的文件全部删除掉,包括Makefile。



我们本着拿来主义的精神,但是拿来主意也让我们的人生道路中荆棘丛丛,从上面的解析可以看出,上面的问题的根源是因为,经过拿来主义的代码里面已经有配置文件,是根据原来的编译环境生成的,仅仅通过makeclean并不能清楚之前的配置文件,没有清除之前的配置文件就进行编译, 编译器本着相信程序员的态度, 编译时不会产生新的 configure生成的附带文件 ,而是根据原来的 configure生成的文件 进行编译,这样就会导致上面的一系列编译错误。makedistclean可以将所有的垃圾,之前环境所有的余孽清理干净,这样就不会给编译器偷懒的机会。那么一个馒头引发的血案就解析完毕。