一、例子

(1)makefile和src源文件不在同一目录下

(2)把.o生成到指定目录下

文件结构目录

  ----inc      //放头文件

  ----lib   //放所需要的.a或者.so文件

  ----src  //放置源文件

  ----obj    //放生成的.o文件

  ----Makefile  //makefile文件

inc有头文件Hi_String.h

src有源文件Hi_String.cpp

#compile and lib parameter
#编译参数
#-g表示可以使用gdb调试
#-Wall是所有错误和警告在编译的时候都打出来
#-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.
# 编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性能.
CC := g++
CCOPT := -g -Wall -O2 #当前makefile路径
CURRENT_PATH := $(shell pwd)
#头文件路径
INC_PATH := $(CURRENT_PATH)/inc
#lib库路径
LIB_PATH := $(CURRENT_PATH)/lib
#源文件路径
SRC_PATH := $(CURRENT_PATH)/src
#object文件路径
OBJS_PATH := $(CURRENT_PATH)/obj #源文件,自动找所有.cpp文件,并将目标定义为同名.o文件
#wildcard:扩展通配符 notdir:去除路径 patsubst:替换通配符
SRC_FILE_DIR := $(wildcard $(SRC_PATH)/*.cpp)
SRC_FILE :=$(notdir $(SRC_FILE_DIR))
#把所有.cpp变成.o文件;这里有两种表达方法
#(1)OBJS_FILE := $(SRC_FILE:.cpp=.o)
#(2)OBJS_FILE := $(patsubst %.cpp,%.o,$(SRC_FILE))
OBJS_FILE := $(SRC_FILE:.cpp=.o) OBJS:=$(OBJS_PATH)/$(OBJS_FILE) TARGET := Hi_String $(OBJS_PATH)/%.o:$(SRC_PATH)/%.cpp
$(CC) $(CCOPT) -I$(INC_PATH) -c $^ -o $@ $(TARGET) : $(OBJS)
$(CC) $(CCOPT) -I$(INC_PATH) -o $@ $^ .PHONY : clean
clean :
rm -rf $(TARGET)
rm -rf $(OBJS)

  这样会把.o文件生成到obj里面;

   把最终可执行文件生成到Makefile一起的目录下

二、wildcard、notdir、patsubst(转)

http://www.cnblogs.com/rayfloyd/archive/2012/12/04/2800995.html

1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符

例子:
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir test
$ cd test
$ mkdir sub

在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件

建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )

all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"

执行结果分析:
第一行输出:
a.c b.c ./sub/sa.c ./sub/sb.c

wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。

第二行输出:
a.c b.c sa.c sb.c
notdir把展开的文件去除掉路径信息

第三行输出:
a.o b.o sa.o sb.o

在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
任何输出。
或者可以使用
obj=$(dir:%.c=%.o)
效果也是一样的。

这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。
它的标准格式是
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a

今天在研究makefile时在网上看到一篇文章,介绍了使用函数wildcard得到指定目录下所有的C语言源程序文件名的方法,这下好了,不用手工一个一个指定需要编译的.c文件了,方法如下:

SRC = $(wildcard *.c)

等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:

SRC = $(wildcard *.c) $(wildcard inc/*.c)

makefile例子《一》的更多相关文章

  1. Makefile例子引入

    Makefile规则 target ... :prerequisites... command target就是一个目标文件,可以是object file,也可以是可以执行文件,也可以是一个标签 pr ...

  2. 一个通用的两级Makefile例子

    目的 进行如项目的顶层目录后,运行make,即可直接编译项目中所有的源文件,并生成最终的可执行文件 实现头文件自动依赖 添加源文件不用修改Makefile,且可以自动编译新文件 顶层目录下添加文件夹, ...

  3. (二十一)Makefile例子

    ROOT_PROJECT = .DIR_INC = -I$(ROOT_PROJECT)/include -I$(ROOT_PROJECT)/include/NE10 DIR_BIN = $(ROOT_ ...

  4. Linux就这个范儿 第8章 我是Makefile

    Linux就这个范儿 第8章 我是Makefile P287 Makefile的作用就是——自动化编译,一旦写好,只需要一个make命令(解析Makefile,执行Makefile中描述的操作),整个 ...

  5. [转] Makefile的条件执行

    条件语句可以根据一个变量的值来控制make执行或者忽略Makefile的特定部分.条件语句可以是两个不同变量.或者变量和常量值的比较.要注意的是:条件语句只能用于控制make实际执行的makefile ...

  6. kernel Makefile Kconfig说明

    实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...

  7. [转]makefile文件的编写规则及实例

    http://xueqi.iteye.com/blog/1567866   1.一个简单的makefile例子   假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生 ...

  8. Linux Makefile

    动态库: gcc getmaxlen.c –fPIC –shared –o libtest.so ldd -r  libtest.so   静态库: ar crv libfirst.a testlib ...

  9. make和makefile介绍

    <strong>先附上一个比较简单的,测试代码用的Makefile</strong> </pre><pre code_snippet_id="463 ...

随机推荐

  1. 二分-poj-3685-Matrix

    题目链接: http://poj.org/problem?id=3685 题目大意: 有n*n的矩阵,第i行第j列的数为Aij= i2 + 100000 × i + j2 - 100000 × j + ...

  2. hdu 5424 Rikka with Graph II(dfs+哈密顿路径)

    Problem Description   As we know, Rikka is poor at math. Yuta is worrying about this situation, so h ...

  3. Team Queue(多队列技巧处理)

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. 基于drools创建自己的关系操作符

    我们知道drools提供了12种关系操作符 但是有些时候这12种操作符依然不能满足我们的业务需求,我们可以扩展自己的操作符,下面是为某一航空公司做项目时扩展了操作符,在这分享下 首先,我们要实现的逻辑 ...

  5. [置顶] cJSON库(构建json与解析json字符串)-c语言

     一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  6. File类的基本操作之InputStream字节输入流

    话不多少,我直接把代码贴上来了.有什么问题请给我留言 package org.mark.streamRW; import java.io.File; import java.io.FileInputS ...

  7. [Cycle.js] Introducing run() and driver functions

    Currently the code looks like : // Logic (functional) function main() { return { DOM: Rx.Observable. ...

  8. Android Fragment详解(五):Fragment与Activity通讯

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  9. Css控制div水平垂直居中显示

    <style>#info{height:0px; width:0px;top:50%; left:50%;position:absolute;}#center{background:#FF ...

  10. uva 10061 How many zero's and how many digits ?

    How many zeros and how many digits? Input: standard input Output: standard output Given a decimal in ...