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 ...
随机推荐
- stardict词典(星际译王)
sudo apt-get install stardict 下载词库: http://abloz.com/huzheng/stardict-dic/zh_CN/ 把下载的压缩包解压,以a为例cd /u ...
- bootstrap学习以及其插件
Bootstrap中文网地址,里面有bootstrap组件的下载与使用说明,现在使用bootstrap3: http://www.bootcss.com/ W3CSchool.CC里面有学习boots ...
- 分享一个option样式传递给select当前选中样式
今天遇到一个很是纠结的问题,需求又改了!原生的select给option加样式,结果发现select选中仍是默认样式,如下图:
- Android字数限制的EditText实现方案研究
在应用开发中,有时需要实现有字数限制的EditText,首先来分析下市面上存在的类似实现方案吧,好有个感性的认识. [方案一:腾讯微博] 每个中文字符算一个字数,每两个英文字符算一个字数,当用户输入内 ...
- 慕课linux学习笔记(一)centOS的安装
在VMware8上安装centos6.3 准备的文件 新建虚拟机 选择新建一个空的虚拟机 选择linux和centos 分配20G的硬盘空间 ' 修改配置 调整内存空间 桥接:虚拟机和真实机通讯使用的 ...
- c# 根据窗口截图,合并图片
c# 根据窗口截图,合并图片 public class CaptureWindows { #region 类 /// <summary> /// Helper class containi ...
- Eclipse下绿色安装插件Aptana、Swing
本文主要针对Ecplise下绿色安装插件,写本篇博客也是因为笔者在Ecplise下安装Aptana时不断安装出现错误,所以写下自己安装成功以及之前出错的原因,也搜集了许多资料在此一并总结一下吧! Ec ...
- C# KeyValuePair<TKey,TValue>与Container
KeyValuePair<TKey,TValue> KeyValuePair<TKey,TValue>是一个结构体,相当于C#一个Map类型的对象,可以通过它记录一个键/值对 ...
- oracle datetime
to_date('" + Convert.ToDateTime(TCRQ).ToString("yyyy-MM-dd")+"','YYYY-MM-DD'), C ...
- I Love You Too HDU 2816
Description This is a true story. A man showed his love to a girl,but the girl didn't replied clearl ...