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. poj 1190 生日蛋糕

    中文题 题目分析 搜索题,非常好的剪枝 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号 ...

  2. Bash 使用技巧

    Bash 是我们经常与之打交道的 Shell 程序,本文针对其使用技巧进行了搜罗.相信在你看过这些内容之后,定会在 Bash 的世界里游刃有余. 从历史中执行命令 有时候,我们需要在 Bash 中重复 ...

  3. 论XCODE工程里使用的宏定义.

    在XCODE开发过程中,经常会遇到引用头文件,引用库路径的问题,如果不是直接的源码引入,则需要在工程中增加设置.虽然现在有了Pod这类集合管理工具,但有时为了一个很小的lib引入Pod这尊大神还是有点 ...

  4. android:clipToPadding 和 android:clipChildren 解决ListView设置padding后 padding不跟随改动

    clipToPadding就是说控件的绘制区域是否在padding里面的,true的情况下如果你设置了padding那么绘制的区域就往里 缩, clipChildren是指子控件是否超过padding ...

  5. pthread_join和pthread_detach的用法(转)

    一:关于join join join是三种同步线程的方式之一.另外两种分别是互斥锁(mutex)和条件变量(condition variable). 调用pthread_join()将阻塞自己,一直到 ...

  6. spark新能优化之shuffle新能调优

    shuffle调优参数 new SparkConf().set("spark.shuffle.consolidateFiles", "true") spark. ...

  7. PHP 安装 eaccelerator

    安装开发工具包: yum groupinstall -y "Development Tools" 查看本机php版本: rpm -qi php 下载rpm包: wget http: ...

  8. Java——异常

     /* * 异常:   是在运行时期  发生的 不正常情况. *  在java中类的形式对不正常情况进行了描述和封装对象. * * 描述不正常的情况类,就成为异常. * * 问题很多,就意味着描述 ...

  9. 黑马程序员——JAVA基础之数组

    ------- android培训.java培训.期待与您交流! ---------- 数组: 数组的定义: 数组是相同类型数据的集合, 描述的是相同类型的若干个数据按照一定的先后顺序排列组合而成,其 ...

  10. java编程之:Unsafe类

    Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率.但是,它是一把双刃剑:正如它的名字所预示的那样,它是 Unsafe的,它所分配的内存需要 ...