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. 30+有用的CSS代码片段

    在一篇文章中收集所有的CSS代码片段几乎是不可能的事情,但是我们这里列出了一些相对于其他的更有用的代码片段,不要被这些代码的长度所吓到,因为它们都很容易实现,并且具有良好的文档.除了那些解决常见的恼人 ...

  2. mysql5.7 慢查底里失败的原因

    正确配置: log_output          = FILEslow-query-log = on slow_query_log_file ="D:/MySQL5.7/data/slow ...

  3. .net 过滤特殊字符

    /// <summary> /// 过滤标记 /// </summary> /// <param name="NoHTML">包括HTML,脚本 ...

  4. (实用篇)微信支付扫码支付php版

    本文实例为大家分享了php微信扫码支付源码,供大家参考,具体内容如下 代码中包含四个文件createUrl.php.ArrayToXML.php.returnGoodsUrl.php.notifyUr ...

  5. SOJ 1717 Computer (单机任务调度)

    一.题目描述 Constraints :Time Limit: 2 secs, Memory Limit: 32 MB Description: We often hear that computer ...

  6. HTC One M7简易刷Recovery教程

          HTC One M7作为当下HTC旗下的旗舰热门机,用户们对于刷机的需求都比较强烈,对于刷ROM的前提就是要刷入Recovery,当然作为安卓智能手机HTC one而言也不例外,最近有些用 ...

  7. Lua table库整理(v5.1)

    这个库提供了表处理的通用函数. 所有函数都放在表 table. 无论何时,若一个操作需要取表的长度, 这张表必须是一个真序列. table.concat(list, [, sep, [, i , [, ...

  8. 【 D3.js 入门系列 --- 6 】 如何让图表动起来

    [5.1]节中制作了一个比较完善的图表,但它是静态的,想做出它的动态效果吗?在D3中只需要短短的几行代码即可. 这一节将涉及4个函数的使用. 1.transition() 启动转变效果只需要添加这个即 ...

  9. Python selenium执行多个测试脚本时,浏览器多次打开登录账户

    当类里面定义了 setUp() 方法的时候,测试程序会在执行每条测试项前先调用此方法:同样地,在全部测试项执行完毕后,tearDown() 方法也会被调用. 所以当在setUp()中执行打开浏览器后, ...

  10. linux命令之三

    0102 文档查阅指令 cat tac nl 简单查阅,-n  可显示行 more, less less is more 查询大文件,可分页. head tail 从头尾看.-n 限制行数. taif ...