makefile的知识点应该很多,看网上的很多教程就能看出来,长的可以写一本书。记录一下自己用的一个简单的makefile,

方便以后查找。

先看一下程序的目录结构:

[root@localhost Exception]# tree ../Exception/
../Exception/
├── build
├── include
│   └── exception.h
├── lib
├── Makefile
├── src
│   ├── exception.cpp
│   └── Makefile
└── test
├── exception_test.cpp
└── Makefile

我们现在要做的是,通过Exception目录下的Makefile控制src和test下的Makefile,将src目录下的程序编译成静态库放到lib目录下,由test目录下程序调用该静态库,

生成可执行文件放入build目录下。

下面看一下我们需要的三个Makefile是怎么写的

Exception/Makefile:

all:
@echo "build start..." cd src && $(MAKE) TARGET_AR=1 #这里TARGET_AR等于任何值都可以,等于0,‘abc’都行,重要的是它被定义了
cd test && $(MAKE) TARGET_APP=1 #$(MAKE)不用自己定义,默认就是make @echo "---done!!!---" clean:
cd src && $(MAKE) clean TARGET_AR=
cd test && $(MAKE) clean TARGET_APP= ------------------------------------------------------------
Exception/src/Makefile:
APP_NAME := libexception ifdef TARGET_AR #这里不能写成ifdef $(TARGET_AR)
TARGET := ../lib/$(APP_NAME).a
endif ifdef TARGET_APP #如果需要编译成动态库,可以加一个ifdef TARGET_SO,在里面加一些动态库选项
TARGET := ../lib/$(APP_NAME)
endif CC := g++
LINUX_AR := ar
SRCS := $(wildcard *.cpp)
OBJS := $(patsubst %.cpp,%.o,$(SRCS)) CFLAGS := -Wall -g
INCPATH := -I../include
LIBPATH := -lstdc++ -lm -lc all:$(TARGET) ifdef TARGET_AR
$(TARGET):$(OBJS)
$(LINUX_AR) -r $(TARGET) $(OBJS)
endif $(OBJS):$(SRCS)
$(CC) $(CFLAGS) $(INCPATH) -c $^ -o $@ clean:
rm -rf $(OBJS)
rm -rf $(TARGET) -------------------------------------------------------------
Exception/test/Makefile:
APP_NAME := test ifdef TARGET_APP
TARGET := ../build/$(APP_NAME)
endif ifdef TARGET_AR
TARGET := ../build/$(APP_NAME).ar
endif CC := g++
SRCS := $(wildcard *.cpp)
OBJS := $(patsubst %.cpp,%.o,$(SRCS)) CFLAGS := -Wall -g
LFLAGS := -lexception
LIBPATH := -L../lib
INCPATH := -I ../include all:$(TARGET) ifdef TARGET_APP
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(LFLAGS) $(LIBPATH)
endif $(OBJS):$(SRCS)
$(CC) $(CFLAGS) $(INCPATH) -c $^ -o $@ clean:
rm -rf $(OBJS)
rm -rf $(TARGET)

有几点得说明一下:

1.wilecard,patsubst的含义。

  在Makefile中给变量赋值时,使用wildcard后,类似于 * 的通配符就可以起作用了。

  $(wildcard *.cpp)就表示所有的.cpp文件

  $(patsubst %.cpp,%.o,$(SRCS))作用是将$(SRCS)中的所有.cpp后缀替换成.o

2. * 和 % 是不同的

  $(wildcard *.cpp)得到所有.cpp文件,$(wildcard %.cpp)什么都得不到

  看下面的例子:

abc=$(patsubst %.cpp,%.o,abc.cpp)
all:
echo $(abc)

  输出是abc.o

abc=$(patsubst *.cpp,*.o,abc.cpp)
all:
echo $(abc)

  输出是abc.cpp

  从上面的例子应该可以看出*和%的区别,*是通配符号,%是用来进行模式匹配的,搞混了很麻烦

3.$^, $@

  $@匹配所有的当前目标文件,$^匹配所有的当前依赖文件,$^像一支箭,射向$@的靶心,这样可能

比较容易记。

  以上应该是我知道的所有的关于Makefile的知识了,比较浅显,可能会有错误。要是想简单的系统的了解下Makefile,

推荐看一下这篇文章:http://www.ruanyifeng.com/blog/2015/02/make.html

makefile小例子的更多相关文章

  1. 几个makefile小例子

    http://www.blogjava.net/canvas/articles/quick_makefile.html http://www.cnblogs.com/azraelly/archive/ ...

  2. springmvc入门的第一个小例子

    今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...

  3. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  4. Runtime的几个小例子(含Demo)

    一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.)           1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);  [runti ...

  5. bootstrap 模态 modal 小例子

    bootstrap 模态 modal  小例子 <html> <head> <meta charset="utf-8" /> <title ...

  6. INI配置文件分析小例子

    随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...

  7. JavaScript小例子:复选框全选

    JavaScript小例子:复选框全选 这只是一个小例子,很简单,但是这个功能还是很常用的: 实现后效果如图: JavaScript代码: <script type="text/jav ...

  8. 【zTree】 zTree使用的 小例子

    使用zTree树不是第一次了  但是 还是翻阅着之前做的 对照着 使用起来比较方便  这里就把小例子列出来   总结一下使用步骤 这样方便下次使用起来方便一点 使用zTree树的步骤: 1.首先  在 ...

  9. js小例子(标签页)

    运用js写的一个小例子,实现点击不同的标签出现不同的内容: <!DOCTYPE html> <html> <head> <meta chaset=" ...

随机推荐

  1. 纠结attr(),prop()

    刚刚看博客无意中看到attr()和prop()的区别,回头就去翻了一下手册,感觉手册上写的过于简单,不能很清晰的分辨出两者的区别,两者的参数用法都是高度相似. attr():设置或返回被选元素的属性值 ...

  2. Java 查漏补缺

    摘自<老马说编程> 计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算 Java中不支持直接写二进制常量,比如,想写二进制形式的11001,Java中不能直接写,可以在前面补0,补 ...

  3. [GodLove]Wine93 Tarining Round #7

    比赛链接: http://vjudge.net/contest/view.action?cid=47643#overview 比赛来源: 2012 ACM/ICPC Asia Regional Han ...

  4. [GodLove]Wine93 Tarining Round #6

    比赛链接: http://vjudge.net/contest/view.action?cid=47642#overview 题目来源: 2012 ACM/ICPC Asia Regional Jin ...

  5. 理解MySQL——索引与优化

    转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...

  6. iOS--时间类date详解

    NSDate定义时间的类 NSDate是一个时间类,在编写程序时,我们很少遇到.今天我突然碰到,感觉很生疏. 给大家发个博客,让大家也都温习一下,哈哈! 兄弟用的时候突然发现竟然有一些bug,大家用时 ...

  7. 安卓微信浏览器中location.href失效的问题

    在移动web中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会存在问题,但是在安卓手机的微信自带浏览器中,会出现一个奇怪的bug. window.loc ...

  8. 基于注解的SpringMVC简单介绍

    SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请 ...

  9. java数组引用

    public class Arriy { public static void main(String args[]){ int data[]=new int[3]; data[0]=10; data ...

  10. Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...