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 ...
随机推荐
- C# 接受邮件 两种方式
有些累了,不想写太多,直接把代码贴上 EWS 源码 POP协议 源码 PS:如果我们发现引入的一个dll,能够添加引用,但是一编译又找不到,那么很有可能是.net framework 版本不同. 不如 ...
- OpenCV: Canny边缘检测算法原理及其VC实现详解(转载)
原文地址:http://blog.csdn.net/likezhaobin/article/details/6892176 原文地址:http://blog.csdn.net/likezhaobin/ ...
- android 点击edittext弹出软键盘,否则不弹
只需要加android:windowSoftInputMode="stateHidden|stateAlwaysHidden"就可以 如:<activity android: ...
- eoe资料
-------------------------------https://github.com/waylau/vpngate-mirrors FQ软件.方法 android优化: http: ...
- 转:struts标签之select详解
<html:select>生成HTML<select>元素 <html:option>:生成HTML<option>元素 <html:option ...
- C#笔记 -----扩展方法
在我们使用vs自带的工具函数时,如: string str='111';str.toInt(); 有没有想到过他们是怎么来的? 这就是C# 的 方法扩展: age: using system: pu ...
- JavaScript学习记录总结(七)——dom对象应用之用户简单管理
<!DOCTYPE html><html><head><title>users.html</title> <meta name=&qu ...
- 多线程问题(JVM重排序)
public class Test3 { private static boolean ready; private static int Number; private static class R ...
- C# Regex.IsMatch (正则表达式验证:数字、小数点、邮件、计算表达式)
public bool isInt(string str) { //^([+-]?)表示加减号只能出现在字符串开头且只有一位 ///d*表示后面可以有多个或一个十进制数 //$表示字符串结尾 retu ...
- 由浅入深漫谈margin属性1
margin 在中文中我们翻译成外边距或者外补白(本文中引用外边距).他是元素盒模型(box model)的基础属性. (该文章解释是否正确有待商榷,目前我的实验结果为:在默认情况或者div左浮动的情 ...