makefile例子《一》
一、例子
(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例子《一》的更多相关文章
- Makefile例子引入
Makefile规则 target ... :prerequisites... command target就是一个目标文件,可以是object file,也可以是可以执行文件,也可以是一个标签 pr ...
- 一个通用的两级Makefile例子
目的 进行如项目的顶层目录后,运行make,即可直接编译项目中所有的源文件,并生成最终的可执行文件 实现头文件自动依赖 添加源文件不用修改Makefile,且可以自动编译新文件 顶层目录下添加文件夹, ...
- (二十一)Makefile例子
ROOT_PROJECT = .DIR_INC = -I$(ROOT_PROJECT)/include -I$(ROOT_PROJECT)/include/NE10 DIR_BIN = $(ROOT_ ...
- Linux就这个范儿 第8章 我是Makefile
Linux就这个范儿 第8章 我是Makefile P287 Makefile的作用就是——自动化编译,一旦写好,只需要一个make命令(解析Makefile,执行Makefile中描述的操作),整个 ...
- [转] Makefile的条件执行
条件语句可以根据一个变量的值来控制make执行或者忽略Makefile的特定部分.条件语句可以是两个不同变量.或者变量和常量值的比较.要注意的是:条件语句只能用于控制make实际执行的makefile ...
- kernel Makefile Kconfig说明
实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...
- [转]makefile文件的编写规则及实例
http://xueqi.iteye.com/blog/1567866 1.一个简单的makefile例子 假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生 ...
- Linux Makefile
动态库: gcc getmaxlen.c –fPIC –shared –o libtest.so ldd -r libtest.so 静态库: ar crv libfirst.a testlib ...
- make和makefile介绍
<strong>先附上一个比较简单的,测试代码用的Makefile</strong> </pre><pre code_snippet_id="463 ...
随机推荐
- Display number of replies in disscussion board
how to display number of replies in disscussion board I have a require about display the replies' nu ...
- Bubble Sort 冒泡排序
//Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...
- 传智播客 Html基础知识学习笔记
HTML基础 <p></p>标志对用来创建一个段落,,<p>标志还可以使用align属性, 它用来说明对齐方式 语法是:<p align="&quo ...
- vue-cli 脚手架总结
> vue-cli 的脚手架项目模板有browserify 和 webpack , 现在自己在用的是webpack , 官网给出了两个模板: webpack-simple 和 webpack 两 ...
- MapReduce新版客户端API源码分析
使用MapReduce新版客户端API提交MapReduce Job需要使用 org.apache.hadoop.mapreduce.Job 类.JavaDoc给出以下使用范例. // Create ...
- uva 11081 - Strings(LCS)
题目链接:11081 - Strings 题目大意:给出三个字符串,从分别从第一个字符串和第二个字符串中挑选子串a,b,用a和b组成第三个字符串,问可组成的子串有多少种. 解题思路:说起来惭愧啊,题目 ...
- .net网站开发(一):1.input表单元素
其实,在半年前我对网站开发还是完全不感冒的,不是没认识,而是只认识到表面.我以为网站模型就那几样,新闻.论坛.博客啥的,仿个站出来有什么意思?但现在我是知道了,大多应用开发还是采用B/S架构的,包括服 ...
- WHY IE AGAIN? - string.charAt(x) or string[x]?
近期今天在写一个"删除字符串中反复字符串"的函数,代码例如以下: 开门见山,重点 string.charAt(index) 取代 string[index] function re ...
- 使用PHPExcel导入导出excel格式文件
使用PHPExcel导入导出excel格式文件 作者:zccst 因为导出使用较多,以下是导出实现过程. 第一步,将PHPExcel的源码拷贝到项目的lib下 文件包含:PHPExcel.ph ...
- js计算日期天数差-2013-9-26
function daymath(sdate, edate) { var startdate = sdate; var enddate = edate; ...