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. iOS按钮设置图片在上文字在下

    UIButton同时设置Title和Image后,默认是图片在左文字在右,如下图1,很多情况下我们希望图片在上图片在下,如下图2,只需要简单的几行代码,即可实现. (1)因为需要处理多个按钮,所以将实 ...

  2. 关于HTML标签那些事儿

    关于html相信对于每一个互联网从业者来说实在熟悉不过的一个名词,特别是web前端工程师来说更是基础中的基础.html是hyper text markup language的首字母缩写,翻译过来就是超 ...

  3. svn/git的diff、patch

    svn/git的diff.patch 前几天,正当我突突的写代码,企业微信嘀嘀一声响”在不,过来帮我看个bug”.本人一向助人为乐,高兴的冲了过去,然后就开始了一段长达1分钟的问题描述.很明显,此同学 ...

  4. android view : 动画

    view中除了必要的移动之外,也可以使用动画来完善视觉效果.android中的动画在2.3之前只有帧动画和补间动画.3.0之后就加入了属性动画.其实说到动画是什么?就是一个连续的view的集合.帧动画 ...

  5. oracle的分析函数over 及开窗函数

    转:http://www.2cto.com/database/201310/249722.html oracle的分析函数over 及开窗函数   一:分析函数over   Oracle从8.1.6开 ...

  6. 关于Autorun.inf文件

    配置Autorun.inf文件可以使双击磁盘时,自动运行某一应用程序.但是现在只支持CD或者DVD媒体了(以前硬盘也可以) 关于Autorun.inf的组成部分可以参考https://msdn.mic ...

  7. Python 基礎 - 元組與簡易購物車實做

    tuple(元組) 其實跟列表差不多,也是存一組數,只不過是它一旦建立了,就不能修改了,只能做 切片 跟 查詢,所以只叫 只讀列表 語法: name = ("Rogers", &q ...

  8. 2017 年值得一瞥的 JavaScript 相关技术趋势

    跨年前两天,Dan Abramov在Twitter上提了一个问题: JS社区毫不犹豫的抛出了它们对于新技术的预期与期待,本文内容也是总结自Twitter的回复,按照流行度降序排列.有一个尚未确定的小点 ...

  9. JPA @MappedSuperclass注解的使用说明

    基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中. 1.@MappedSuperclass注解只能标准在类上:@ ...

  10. Mongodb和Hive详细对比

    本文主要用于分析在大数据场景下Mongodb和Hive的优缺点: 支持的数据类型 支持的查询 支持的数据量 性能优化手段