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. jni数据传递——会不断的更新,测试没有问题,再整理进来。

    工作中遇到了ndk编程,其实核心就是java和本地的数据交互.现把所有数据类型的传递写成demo. 1,ini数组传递  我们实现传递8个数值过去,然后本地将八个数值放到数组,返回. java代码: ...

  2. Web端文件打包.zip下载

    使用ant.jar包的API进行文件夹打包.直接上代码: String zipfilename = "test.zip"; File zipfile = new File(zipf ...

  3. Java——异常

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

  4. 黑马程序员——JAVA基础之简述 类的封装

    ------- android培训.java培训.期待与您交流! ---------- 类的封装(Encapsulation)  封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 封装优 ...

  5. feature visualization from ipython notebook

    Feature visualization from ipython notebook Wang Xiao 1. install anaconda2 from: https://www.continu ...

  6. JSBinding + SharpKit / 安装SharpKit以及添加SharpKit工程

    本文说明如何往 sln 中添加 SharpKit 工程,以及配置. SharpKit 工程用于将 C# 源代码编译成 JS  代码. QQ群 189738580 1. 安装SharpKit 到 sha ...

  7. Android Studio导入Project的方法

    Android Studio到现在已经发展到0.8+的版本了,最近也在试着使用它,原因是多方面的,一个毕竟是未来的趋势,二则是github上越来越多的大牛开源项目都是基于Android Studio的 ...

  8. Linux ext2文件系统

    Linux最传统的磁盘文件系统(filesystem)使用的是ext2 1.ext2文件系统结构ext2文件系统划分为多个块组,每个块组拥有独立的inode/block,一个文件系统只有一个Super ...

  9. MyBatis入门学习

    所需要jar包:mybatis-3.x.x.jar .如果需要和spring整合,还需要加入相关的包 1:看项目目录 红颜色不要关心 2:按照步骤: 1:加入jar包 2:创建数据源(configur ...

  10. 003. 连接access数据库代码

    1. 前端aspx中的代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...