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. 安装MySql for Visual Studio后,打开IDE找不到MySql选项

    只能说安装程序功能不健全,找不到Visual Studio也不问,自己随便找了个地儿把插件放下了...这程序员真2! 原文在这里,作者思路对头.原文:"安装MySql for Visual ...

  2. [转]Jenkins使用 管理节点

    现在我们已经搭建好了基本的Jenkins环境,在这一集里,我们说一说如何管理节点. 进入“系统管理”中的“管理节点”. 创建Windos系统的奴隶节点 先创建一台安装了Win7系统的虚拟机,作为Jen ...

  3. 如何开启ubuntu的SSH服务

    buntu默认并没有安装ssh服务,如果通过ssh链接ubuntu,需要自己手动安装ssh-server,然而SSH分客户端openssh-client和服务端openssh-server,opens ...

  4. linux curl 下载jdk

    进入orecle官网,找到需要的安装包 需要cookie同意相关协议才能下载 curl -L "http://download.oracle.com/otn-pub/java/jdk/8u1 ...

  5. Jquery 点击图片在弹出层显示大图

    http://blog.csdn.net/wongwaidah/article/details/28432427(案例链接出处,本人只是转载收藏) <html> <head> ...

  6. java中文乱码分析整理

    在JavaWeb应用开发中,经常会出现页面中本该显示中文的地方却是乱码的情况.究其原因,主要是由于在Web组件之间.或Web组件与浏览器.与数据库所使用的字符集标准不统一,Web应用程序运行过程中,中 ...

  7. linux yum软件管理

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  8. PSP第九周

    一.表格 C(分类) C(内容) S(开始时间) ST(结束时间) I(打断时间) △(净工作时间) 学习 UML 12:30 13:20 0 50 编码 编码 20:00 22:10 0 130 学 ...

  9. pyqt4:连接的一个带有参数的方法

    一般在pyqt4中的信号连接很少连接带参数的方法,很多时候连接带参数的方法节约不少代码量. self.s5_thread=scene.Worker5() self.log_get=QtCore.QTi ...

  10. c#大数加法

    在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...