makefile学习笔记(多目录嵌套调用、变量使用)
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学习笔记(多目录嵌套调用、变量使用)的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- thinkphp学习笔记1—目录结构和命名规则
原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...
- <转>Windows平台下Makefile学习笔记(二)
本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...
- Flutter学习笔记(3)--Dart变量与基本数据类型
一.变量 在Dart里面,变量的声明使用var.Object或Dynamic关键字,如下所示: var name = ‘张三’: 在Dart语言里一切皆为对象,所以如果没有将变量初始化,那么它的默认值 ...
- (转)Python学习笔记(1)__name__变量
Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行.每个文件(模块)都可以任意写一些没有缩进的代码,并在载入时自动执行.为了区分 主执行代码和被调用文件,Python引入 ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- MongoDB学习笔记系列~目录
MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- Django 学习笔记(四)模板变量
关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...
随机推荐
- CSS基础知识点(二)——选择器
在这一篇中,主要总结一下CSS中的选择器. 参考:http://www.cnblogs.com/webblog/archive/2009/07/07/1518274.html CSS中的选择器主要包括 ...
- leetcode之链表排序题
原文链接:点击打开链接 原题是这样的: Given a linked list and a value x, partition it such that all nodes less than x ...
- MATLAB格式化输出控制
format 默认格式 format short 5字长定点数 format long 15字长定点数 format short e 5字长浮点数 format long e 15字长浮点数 form ...
- API读取和处理的文件
1.FileList对象 FileList对象是File对象的一个集合,设置multiple就可以多文件上传.2.Blob对象 Blob对象就是一个二进制原始数据对象,它提供了slice方法可以读取 ...
- HTML 常见代码整合;
html+css代码 文本设置 1.font-size: 字号参数 2.font-style: 字体格式 3.font-weight: 字体粗细 4.颜色属性 color: 参数 注意使用网页安全色 ...
- 最大连续子序列和问题(Maximum Consecutive Subsequence Sum)
该算法的定义是:给出一个int序列,元素有正有负,找出其中的最大连续子序列的和. 例如:-2,11,-4,13,-5-2,:最大和为20(11,-4, 13). 怎么考虑这个问题呢? 要充分利用,连续 ...
- leetcode 41 First Missing Positive ---java
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- 课堂所讲整理:输入输出流(I/O)
package org.hanqi.ex; import java.io.*; public class TestFile { public static void main(String[] arg ...
- HDU-4521 小明系列问题――小明序列(线段树)
题目大意:求LIS,但是要求LIS中相邻的两个元素之间的距离要大于d. 题目分析:线段树.节点(l,r)保存信息为LIS的最后一个元素落在[l,r]之间的最大长度.从第d+2个元素开始查询更新操作,但 ...
- 【原创】Algorithms:原地归并排序
第一次归并: a[0] a[1] a[2] a[3] a[4] a[5] a[6] 23 8 19 33 15 6 27 ↑ ↑ i j 最开始i指向a[0],j指向a ...