大家好,今天小编来为大家解答以下的问题,关于ldd3中文版第29页hello.c的Makefile分析,这个很多人还不知道,现在让我们一起来看看吧!
当使用命令make -C ~/linux-2.6.10 M=`pwd`modules时,流程如下:
我们来解释一下该命令中各个参数的含义:
1、-C ~/linux-2.6.10,这个参数在“man make”中有解释,意思是Change Directory。 make命令看到这个参数时,会先去指定的目录,然后再去指定的目录。找到目录下的Makefile文件并开始执行。这里是Linux源代码根目录下的Makefile文件。
2. M=`pwd`,该参数不是make命令的Option,在“man make”中找不到。该参数将直接传递到Makefile 文件中。我们可以在Linux源代码根目录下的Makefile文件中找到它。相关解释是指该参数指定要编译的外部模块的目录。通过该参数,Linux编译系统将不会编译Linux源代码中的代码,而是直接编译外部模块的代码。
3.modules,这个参数也是直接传给Linux根目录下的Makefile文件,表示编译模块。如果不加M参数,则编译Linux源代码中的模块。如果添加M参数,则编译外部模块。该参数的含义可以通过在Linux源代码根目录下执行“make help”来查看。
当直接使用命令make编译而不添加参数时,过程如下:
可以看到编译过程中添加了一条指令。该指令与我们上面使用make 和参数编译时使用的指令相同。现在我们来分析一下当make不带参数编译时我们的Makefile文件的执行顺序。
1、首先make会不加参数,直接查找当前目录下的Makefile,执行第二行,看看是否有变量$(KERNELRELEASE)。我们目前没有这个变量。
2、执行第6行和第7行,分别定义两个变量作为-C和M的参数值。
3、执行第10行,这是我们用make参数编译时的指令。该指令首先将目录切换到linux源代码根目录,然后在linux源代码根目录中查找Makefile文件,并执行该Makefile文件。 Makefile文件会定义$(KERNELRELEASE)变量,然后当你看到模块时,你就会知道你要编译这个模块。根据M参数找到外部模块中的Makefile文件,并执行这个Makefile文件。
4. 再次执行Makefile的第2行,看看是否有变量$(KERNELRELEASE)。这次是。
5、执行到第3行,根据该行找到hello.c,编译hello.o。
6.然后返回Linux源代码中的Makefile,进行一些其他操作,例如将hello.o更改为hello.ko。
书上还说我们的Makefile被执行了两次。第一次是直接使用make命令在当前目录下查找Makefile。第二次是使用Linux源码根目录下的Makefile根据M参数找到外部模块的Makefile。文档。
另请注意,/lib/modules/$(shell uname -r)/build实际上是一个软链接,指向真正的Linux源代码的根目录。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/136401.html
用户评论
孤单*无名指
终于看到有人对lDD3的Makefile文件做解读!我好久没碰过C语言的编译了,感觉自己快要忘记它的用法了。看了你的解析,又让我回忆起当初学习c语言的时候,那个简单直接的文件结构真是让人心旷神怡啊。
有6位网友表示赞同!
铁树不曾开花
这篇博文干货满满啊!Makefile文件确实有时候让人眼花缭乱,你的解释很清晰易懂,特别是对目标文件的依赖关系和规则的描述,非常到位。以后遇到类似问题可以直接参考这篇文章,真棒!
有18位网友表示赞同!
繁华若梦
ldd3第29页那个hello.c程序我见过,记得当时跟着教程一遍遍编译修改,感觉自己已经掌握了Makefile文件编写的规律。你的解析还有一些我认为需要补充的地方,比如针对不同编译器的差异,或者更详细的解释一些特定规则,我觉得可以进一步完善这篇文章。
有15位网友表示赞同!
米兰
这个Makefile文件还是挺基础的,对于初学者来说可能不太有什么用处,毕竟实际项目中会用到更复杂的文件结构和语法。如果能举例一些实际项目的Makefile代码,并进行分析对比,效果会更佳。
有8位网友表示赞同!
没过试用期的爱~
看完你的解析后突然想起了 Makefile 文件里的注释功能, 之前一直没怎么关注,你提到的这些使用场景让我豁然开朗,以后好好学习一下笔记的重要性!
有11位网友表示赞同!
尘埃落定
我其实对LD3没什么了解,不过看你的文章标题感觉还挺专业的。不过说实话一些术语的解释还是比较浅显,需要搭配一些实际案例一起讲解才能更容易理解吧?
有7位网友表示赞同!
余笙南吟
ldd3中文版这本教材不错啊,学习过很多开源代码的Makefile文件,感觉都是用这个版本的格式写的,对你来说更方便理解了。
有13位网友表示赞同!
从此我爱的人都像你
我对Makefile文件不太了解,看了你的解析后觉得这东西确实很有用处,可以提高开发效率。 以后有机会再深入学习一下!
有17位网友表示赞同!
命里缺他
这个解释太简单了,我当时看ldd3的时候感觉这些Makefile都是些基础代码嘛!想看更复杂、更有实践价值的分析才更吸引人的哦。
有8位网友表示赞同!
杰克
个人觉得Makefile文件最重要的就是清晰的结构和规칙,你的解析没有点出重点所在, 应该更加强调如何设计一个合理的目标依赖关系以及规则,才能真正帮助读者写出易懂且效率高的Makefile文件。
有12位网友表示赞同!
歇火
学习计算机语言的过程真的让人热血沸腾!我记得当时学习ldd3的时候,第一个编译成功的代码感觉自己简直变身程序员了。Makefile文件确实让编程过程更加便捷高效,感谢你的解析!
有5位网友表示赞同!
◆残留德花瓣
我一直认为,学习编程最重要的就是掌握底层知识,比如理解Makefile等工具的工作原理。你的博文让我更深入地了解了C语言的编译机制和Makefile文件的编写规则,真是受益匪浅!
有13位网友表示赞同!
莫阑珊
这篇文章对 Makefile 文件的基本语法做了很好的解释,但我感觉对于熟悉代码结构的人来说可能有些过于基础。如果能针对一些常见的问题进行深入探讨,比如如何优化Makefile文件、处理复杂依赖关系等,会更加实用。
有16位网友表示赞同!
大王派我来巡山!
我以前一直不喜欢用 Makefile 来管理项目,觉得太繁琐了,但看了你的博文后,对它有了新的理解。你解释了很多实际案例和技巧,让我明白了Makefile 的优势所在。看来我需要重新学习一下这个工具!
有19位网友表示赞同!
予之欢颜
ldd3中文版的教材确实不错,很多内容都非常实用。不过对于初学者来说,有些地方还是比较抽象难懂,希望作者能提供更详细的讲解和示例。
有10位网友表示赞同!
执笔画眉
Makefile文件虽然简洁,但其作用远远不简单。你的解析重点阐述了目标依赖关系、规则定义等核心概念,对理解Makefile文件的结构和逻辑很有帮助!
有20位网友表示赞同!
念初
我经常使用Makefile来管理项目代码,这篇文章让我回顾了一些常用的技巧,同时也开拓了我的视野。比如关于自动生成文档、实现跨平台编译等等,这些功能都值得深入学习!
有12位网友表示赞同!