http://blog.csdn.net/leexiang_han/article/details/9274229

 

学习了几天的makefile的嵌套调用编写也有一些心得,先声明,我也是初学者写文章只是为了更好的交流,也希望避免其他刚入Linux编程大门的童鞋少走弯路。以下都是经过我多次测试并跑成功的,如有偏差还请见谅与指正。

我有两个练习例子:

①先来说说第一个例子:生成一个可执行文件edit

top 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.c

gcc-c sub1.c

接下来是子目录sub2下的makefile:

sub2.o : sub2.c

gcc -csub2.c

都很简单对吧,就一条正常的编译命令,最后是根目录下的makefile:

VPATH=./sub1 ./sub2

obj=main.o sub1.o sub2.o

edit : $(obj)

gcc -oedit main.o ./sub1/sub1.o ./sub2/sub2.o

main.o : main.c

gcc -cmain.c

sub1.o : sub1.c

$(MAKE) -C./sub1

sub2.o : sub2.c

$(MAKE) -C./sub2

.PHONY : clean

clean :

rm editmain.o -fr

rm./sub1/*.o -fr

rm./sub2/*.o -fr

②下面就说说我的第二个练习例子:生成两个可执行文件edit1、edit2

top 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.c

gcc -cmain1.c

接下来是子目录main2的makefile:

main2.o : main2.c

gcc -cmain2.c

最后是根目录下的makefile:

VPATH = ./main1 ./main2

obj1 = main1.o lib.o

obj2 = main2.o lib.o

all : edit1 edit2

edit1 : $(obj1)

gcc -o./main1/edit1 ./main1/main1.o lib.o

main1.o : main1.c

$(MAKE) -C./main1

lib.o : lib.c

gcc -clib.c

edit2 : $(obj2)

gcc -o ./main2/edit2./main2/main2.o lib.o

main2.o : main2.c

$(MAKE) -C./main2

.PHONY : clean

clean :

rm *.o -fr

rm./main1/*.o ./main1/edit1 -fr

rm./main2/*.o ./main2/edit2 –fr

难道你认为这次学习就结束了吗??当然不!上面这些makefile的确能满足嵌套调用的基本需求,但是你不觉得./sub1/sub1.c,./sub2/sub.2这些路径的表达很烦琐吗?万一这是个大的工程项目,突然要往某个子目录下增加一个源文件,那么修改这些makefile还不弄死你啊,可怕的不是累而是容易遗漏某一处而导致错误,所以对于立志成为一个好的makefile的编写员的人这些还远远不够!下面就让我们来对以上的makefile进行一次改头换面吧!领略一下变量的风采!

①    第一个例子的根目录下的makefile修改如下,其余两个makefile不变:

cur-dir:=$(shell pwd)

s1=$(cur-dir)/sub1

s2=$(cur-dir)/sub2

obj=main.o sub1.o sub2.o

edit : $(obj)

gcc -oedit main.o $(s1)/sub1.o $(s2)/sub2.o

main.o : main.c

gcc -cmain.c

sub1.o : $(s1)/sub1.c

$(MAKE) -C$(s1)

sub2.o : $(s2)/sub2.c

$(MAKE) -C$(s2)

.PHONY : clean

clean :

rm editmain.o -fr

rm $(s1)/*.o-fr

rm$(s2)/*.o -fr

②    第二个例子的根目录下的makefile修改如下,其余两个makefile不变:

cur-dir:=$(shell pwd)

s1=$(cur-dir)/main1

s2=$(cur-dir)/main2

obj1 = main1.o lib.o

obj2 = main2.o lib.o

all : edit1 edit2

edit1 : $(obj1)

gcc -o$(s1)/edit1 $(s1)/main1.o lib.o

main1.o : $(s1)/main1.c

$(MAKE) -C$(s1)

lib.o : lib.c

gcc -clib.c

edit2 : $(obj2)

gcc -o$(s2)/edit2 $(s2)/main2.o lib.o

main2.o : $(s2)/main2.c

$(MAKE) -C$(s2)

.PHONY : clean

clean :

rm *.o -fr

rm$(s1)/*.o $(s1)/edit1 -fr

rm$(s2)/*.o $(s2)/edit2 -fr

makefile学习笔记(多目录嵌套调用、变量使用)的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. thinkphp学习笔记1—目录结构和命名规则

    原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...

  3. <转>Windows平台下Makefile学习笔记(二)

    本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...

  4. Flutter学习笔记(3)--Dart变量与基本数据类型

    一.变量 在Dart里面,变量的声明使用var.Object或Dynamic关键字,如下所示: var name = ‘张三’: 在Dart语言里一切皆为对象,所以如果没有将变量初始化,那么它的默认值 ...

  5. (转)Python学习笔记(1)__name__变量

    Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行.每个文件(模块)都可以任意写一些没有缩进的代码,并在载入时自动执行.为了区分 主执行代码和被调用文件,Python引入 ...

  6. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  7. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

  8. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  9. Django 学习笔记(四)模板变量

    关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...

随机推荐

  1. iOS学习笔记---oc语言第四天

    字符串 数组 一.使用苹果帮助文档 学会使⽤用苹果帮助⽂文档是开发者的⼀一项技能 Inherits from 继承⾃自 Conforms to 遵循什么协议 Framework 属于哪个框架 Avai ...

  2. Linux bashrc和profile的用途和区别

    导读 使用终端ssh登录Linux操作系统的控制台后,会出现一个提示符号(例如:#或~),在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的Shell来做处 ...

  3. 完全搞懂傅里叶变换和小波(1)——总纲<转载>

    无论是学习信号处理,还是做图像.音视频处理方面的研究,你永远避不开的一个内容,就是傅里叶变换和小波.但是这两个东西其实并不容易弄懂,或者说其实是非常抽象和晦涩的! 完全搞懂傅里叶变换和小波,你至少需要 ...

  4. 装载:深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...

  5. sgu259 Printed PR    贪心

    link:http://acm.sgu.ru/problem.php?contest=0&problem=259 思路就是贪心. 首先要读懂题目,输入的方式,把样例读懂. 第一,打印的总时间一 ...

  6. 不容易系列之(3)—— LELE的RPG难题

    有排成一行的n个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法. 思路:运用递归算法. a[1 ...

  7. POJ 1966 Cable TV Network(顶点连通度的求解)

                               Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  8. 用vi写一个C 程序

    root@IdeaPad:~# ls 1.txt 3.txt 5.txt 6.py evilxr test 2.txt 4.txt 5.txt~ e.txt evilxr.txt root@IdeaP ...

  9. 编写linux驱动所用到的头文件(转)

    转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...

  10. java的nio之:java的nio系列教程之channel的概念

    一:java的nio的channel Java NIO的通道类似流,但又有些不同: ==>既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. ==>通道可以异步地读写. ...