makefile学习笔记.doc_第1页
makefile学习笔记.doc_第2页
makefile学习笔记.doc_第3页
makefile学习笔记.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习了两天的makefile的嵌套调用编写也有一些心得,先声明,我也是初学者写文章只是为了更好的交流,也希望避免其他刚入Linux编程大门的童鞋少走弯路。以下都是经过我多次测试并跑成功的,如有偏差还请见谅与指正。我有两个练习例子:先来说说第一个例子:生成一个可执行文件edittop dir(根目录)下有源文件main.c、makefile(主)、文件夹sub1、文件夹sub2;子目录sub1里有源文件sub1.c和makefile(次1);子目录sub2里有源文件sub2.c和makefile(次2)。main.c里有主函数,需要调用sub1.c里的排序函数(按升序排)和sub2.c里的排序函数(按降序排)。要求通过根目录下的makefile嵌套调用子目录下的makefile来编译,最后链接生成可执行文件edit。好了,我就不贴三个源文件的C代码了,大家自己写用来测试,我就直接贴makefile的编写了。首先是子目录sub1下的makefile:sub1.o : sub1.cgcc -c sub1.c接下来是子目录sub2下的makefile:sub2.o : sub2.cgcc -c sub2.c都很简单对吧,就一条正常的编译命令,最后是根目录下的makefile:VPATH=./sub1 ./sub2obj=main.o sub1.o sub2.oedit : $(obj)gcc -o edit main.o ./sub1/sub1.o ./sub2/sub2.omain.o : main.cgcc -c main.csub1.o : sub1.c$(MAKE) -C ./sub1sub2.o : sub2.c$(MAKE) -C ./sub2.PHONY : cleanclean :rm edit main.o -frrm ./sub1/*.o -frrm ./sub2/*.o -fr下面就说说我的第二个练习例子:生成两个可执行文件edit1、edit2top dir(根目录)下有源文件lib.c、makefile(主)、文件夹main1、文件夹main2;子目录main1里有源文件main1.c和makefile(次1);子目录main2里有源文件main2.c和makefile(次2)。main1.c和main2.c里都有主函数,需要调用lib.c里的求和函数,只是所传递的参数值不同。要求通过根目录下的makefile嵌套调用子目录下的makefile来编译,最后链接生成可执行文件edit1和edit2,最后执行edit1和edit2应该能得到两个不同的值(也就是lib.c所求得的和)。首先是子目录main1的makefile:main1.o : main1.cgcc -c main1.c接下来是子目录main2的makefile:main2.o : main2.cgcc -c main2.c最后是根目录下的makefile:VPATH = ./main1 ./main2obj1 = main1.o lib.oobj2 = main2.o lib.oall : edit1 edit2edit1 : $(obj1)gcc -o ./main1/edit1 ./main1/main1.o lib.omain1.o : main1.c$(MAKE) -C ./main1lib.o : lib.cgcc -c lib.cedit2 : $(obj2)gcc -o ./main2/edit2 ./main2/main2.o lib.omain2.o : main2.c$(MAKE) -C ./main2.PHONY : cleanclean :rm *.o -frrm ./main1/*.o ./main1/edit1 -frrm ./main2/*.o ./main2/edit2 fr难道你认为这次学习就结束了吗?当然不!上面这些makefile的确能满足嵌套调用的基本需求,但是你不觉得./sub1/sub1.c,./sub2/sub.2这些路径的表达很烦琐吗?万一这是个大的工程项目,突然要往某个子目录下增加一个源文件,那么修改这些makefile还不弄死你啊,可怕的不是累而是容易遗漏某一处而导致错误,所以对于立志成为一个好的makefile的编写员的人这些还远远不够!下面就让我们来对以上的makefile进行一次改头换面吧!领略一下变量的风采! 第一个例子的根目录下的makefile修改如下,其余两个makefile不变:cur-dir:=$(shell pwd)s1=$(cur-dir)/sub1s2=$(cur-dir)/sub2obj=main.o sub1.o sub2.oedit : $(obj)gcc -o edit main.o $(s1)/sub1.o $(s2)/sub2.omain.o : main.cgcc -c main.csub1.o : $(s1)/sub1.c$(MAKE) -C $(s1)sub2.o : $(s2)/sub2.c$(MAKE) -C $(s2).PHONY : cleanclean :rm edit main.o -frrm $(s1)/*.o -frrm $(s2)/*.o -fr 第二个例子的根目录下的makefile修改如下,其余两个makefile不变:cur-dir:=$(shell pwd)s1=$(cur-dir)/main1s2=$(cur-dir)/main2obj1 = main1.o lib.oobj2 = main2.o lib.oall : edit1 edit2edit1 : $(obj1)gcc -o $(s1)/edit1 $(s1)/main1.o lib.omain1.o : $(s1)/main1.c$(MAKE) -C $(s1)lib.o : lib.cgcc -c lib.cedit2 : $(obj2)gcc -o $(s2)/edit2 $(s2)/main2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论