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. magento的url中 去掉多余的目录层级

    有时我们需要仅仅显示一层目录的URL路径.而不要出现多个路径的现实,我们可以用以下方法修改: Edit  /app/code/core/Mage/Catalog/Model/Url.php 找到632 ...

  2. 支持coclock模式

    1. /mediatek/custom/htt82_tb_jb5/cgen/cfgdefault/CFG_GPS_Default.h GPS Coclk: 0xFE (enable) 0xFF (di ...

  3. js按钮浮动随手指方向移动而移动

    window.document.getElementById("moveDIV").addEventListener("touchmove", function ...

  4. AppStore遭遇大BUG

    用AppLoader上传,提示这个 The u option must have a non-empty value.The password must have a non-empty value. ...

  5. Java EE-Eclipse 运行Jsp项目遇到的几个问题及解决方法

    1.导入sql包错误 解决办法: 点击项目右击Properties->Java Build Path —> Libraries—>JRE System Library –> E ...

  6. SpringMVC,3种不同的URL路由配置方法

    1. 先说说一种比较常见的: <servlet> <servlet-name>theDispatcher</servlet-name> <servlet-cl ...

  7. windows 7 右下角登陆信息去除

    ---恢复内容开始--- 开始--运行中输入regedit 找到注册表键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NlaSvc\Par ...

  8. 用php脚本给html中引用的js和css路径打上版本

    比如 <link rel="stylesheet" type="text/css" href="./css/globel.css"&g ...

  9. Swift笔记

    最近从Xcode6 beta4开始到现在的Xcode6.0.1,使用Swift一段时间了,Swift大体来说,语法与java.c++比较接近,相比objective-c要友好多了,也更容易上手,这里记 ...

  10. Obiee11g变量

    原文地址:http://xee123.blog.163.com/blog/static/277119942012612104438332/ Obiee 版本 11.1.1.5 库变量 库变量在同一时刻 ...