makefile解析:一些常用函数

时间:2023-02-23 10:44:46

#=======================================================================

#指定目标文件名,makefile中的变量直接使用不用申明

EXENAME = game_snake

#加-g 生成debug调试信息 注释掉DEFINES则编译RELEASE模式
DEFINES = -g

#编译器
CC = g++
LINK = buildserver

#动态库
LIB_SO += curl

#静态库
#STATIC_LIB = /usr/local/lib/liblua.a

#源文件目录
ROOT = $(shell pwd)        #ROOT = $(shell pwd) 获得Makefile的当前路径

SRC_DIR = $(ROOT)/src/
SRC_DIR += $(ROOT)/comm/

#头文件目录
INCS = $(shell find $(SRC_DIR) -name '*.h')     #寻找pwd目录下的所有名字后缀为.h的头文件
INC_DIR = $(dir $(INCS))

#头文件目录排序
INCLUDE = -I.
INCLUDE += $(sort $(foreach i, $(INC_DIR), -I$(i)))  #对INC_DIR所代表的头文件进行排序
#INCLUDE += /usr/local/include/

#源文件
#SRCS = $(wildcard *.cpp)                             #制定目录下的cpp文件全部展开
_SRCS = $(shell find $(SRC_DIR) -name '*.cpp')        #寻找SRC_DIR所代表目录下的所有名字后缀为.cpp的头文件

#需要排除的目录
#_EXCLDIR = XXX

#需要排除的源文件
_EXCLUS = $(shell find $(_EXCLDIR) -name '*.cpp')

#排除后的源文件
SRCS = $(filter-out $(_EXCLUS), $(_SRCS))        #排除指定目录下的文件

#中间文件
OBJS = $(patsubst %.cpp, %.o, $(SRCS))                #生存.cpp相对应的.o文件,   模式匹配替换SRCS所代表的字符串中后缀为.cpp的替换为.o

#$(subst FROM, TO, TEXT),即将字符串TEXT中的子串FROM变为TO。 subst 是全字符串替换,patsubst 是模式替换

#目标文件目录
ifndef DEFINES
EXE_DIR = $(ROOT)/bin
else
EXE_DIR = $(ROOT)/bin
endif

#目标文件
EXES = $(EXE_DIR)/$(EXENAME)

#编译优化选项 -O1:一级优化 为release版本
ifeq ($(origin DEFINES), undefined)  #origin函数判断DEFINES的出生情况,如果DEFINES未定义过那么$(origin DEFINES)返回undefined 这个if判断为真
DEFINES = -O1
OPTIONS = -s
endif

#编译选项:_LOGSCR - 日志信息输出到屏幕;_LOGFILE - 日志输出到文件;
CFLAGS = -Wall $(DEFINES) -D_LOGFILE  #选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。

ifeq ($(origin OPTIONS), undefined)
CFLAGS += -D_LOGSCR  #输出日志到屏幕
else
CFLAGS += -D_RUNSERVICE  #后台模式 日志不屏显
endif

#连接选项
LFLAGS = $(OPTIONS)
LFLAGS += -lm -m64 -ldl -rdynamic -L$(LIB_DIR) -L$(TUXDIR)/lib -L$(LIB_DIR)/ActiveMQ -lcurses     ## -lm: 显示连接数学库,,-m32: 编译为32位代码,,-ldl: 表示生成的对象模块需要使用共享库,,-rdynamic: 用来通知链接器将所有符号添加到动态符号表中(目的是能够通过使用 dlopen 来实现向后跟踪) 
#LFLAGS += -L/usr/local/lib -DLUA_USE_READLINE
LFLAGS += $(foreach i, $(LIB_SO), -l$(i)) #动态库连接
#LFLAGS += /usr/lib/cjson.so

#规则
#all:$(EXES)               #目标文件

$(EXES):$(OBJS)            #依赖关系
$(CC) -o $@ $(LFLAGS) $(OBJS) $(LFLAGS) $(STATIC_LIB)  #连接选项LFLAGS,,依赖哪些动态库 + 依赖哪些目标文件 + 依赖哪些静态库

$(OBJS):%.o:%.cpp 
$(CC) -o $@ -c $< $(CFLAGS) $(INCLUDE)    #有的.o文件的生成依赖其他.o文件,,$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件

#$(SRCS:.cpp=.o):$(INCS)

clean:
-rm -f $(OBJS)
-rm -f $(EXE_DIR)/ULOG.*
-rm -f $(EXE_DIR)/access.*
-rm -f $(EXE_DIR)/good.*
-rm -f $(EXE_DIR)/*.log
-rm -f $(EXES)

cleanall: clean
rm -f $(EXES)

rebuild: cleanall
make

#=======================================================================

1.Makefile基本语法

target为要生成的目标文件;dependency为target的依赖文件;command为用于生成target的命令行;

<target> : <dependency> <dependency> ...
(tab)<command>
(tab)<command>

$(shell find $(SRC_DIR) -name '*.h') #寻找SRC_DIR所代表目录下的所有名字后缀为.h的头文件  

$(sort $(foreach i, $(INC_DIR), -I$(i))) #对INC_DIR所代表的头文件进行排序

$(shell find $(SRC_DIR) -name '*.cpp') #寻找SRC_DIR所代表目录下的所有名字后缀为.cpp的头文件

$(patsubst %.cpp, %.o, $(SRCS)): 模式匹配替换SRCS所代表的字符串中后缀为.cpp的替换为.o

$(subst FROM, TO, TEXT),即将字符串TEXT中的子串FROM变为TO。 ------subst 是全字符串替换,patsubst 是模式替换

ifeq ($(origin DEFINES), undefined) --判断是否相等。。 origin函数判断DEFINES的出生情况,如果DEFINES未定义过那么$(origin DEFINES)返回undefined 这个if判断为真
g++ 后面跟的参数: -lm -m32 -ldl -rdynamic

-lm: 显示连接数学库

-m32: 编译为32位代码

-ldl: 表示生成的对象模块需要使用共享库

-rdynamic: 用来通知链接器将所有符号添加到动态符号表中 
(目的是能够通过使用 dlopen 来实现向后跟踪) 选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件
http://blog.csdn.net/kesaihao862/article/details/7332528

makefile解析:一些常用函数的更多相关文章

  1. Python3&period;x的BeautifulSoup解析html常用函数

    Python3.x的BeautifulSoup解析html常用函数 1,初始化: soup = BeautifulSoup(html) # html为html源代码字符串,type(html) == ...

  2. 【Makefile】Makefile中的常用函数简介

    1. subst函数 格式:$(subst <from>, <to>, <text>)功能:把字串<text>中的<from>字符串替换成& ...

  3. makefile 常用函数

    Linux下编译c/c++源码需要编写makefile文件,文章参看 http://blog.sina.com.cn/s/blog_4c4d6e74010009jr.html 一函数的调用语法 二字符 ...

  4. numpy&period;random模块常用函数解析

    numpy.random模块中常用函数解析 numpy.random模块官方文档 1. numpy.random.rand(d0, d1, ..., dn)Create an array of the ...

  5. python重要的第三方库pandas模块常用函数解析之DataFrame

    pandas模块常用函数解析之DataFrame 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器 ...

  6. pandas模块常用函数解析之Series(详解)

    pandas模块常用函数解析之Series 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器输入网 ...

  7. Makefile常用函数总结

    在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具 有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函 数的返回值可以当做变量来使用. 一 ...

  8. PHP常用函数备用

    刚学习php的时候,我也为记忆php函数苦恼不已.认为干嘛记忆这么枯燥无味的东西呢?用的时候查一下手册不就行了吗?但是当时因为身在辅导机构,还是记忆了一大堆自己并不感兴趣的函数. 由此就想起来,小的时 ...

  9. 10月21日下午PHP常用函数

    函数四要素:返回类型  函数名  参数列表  函数体 //最简单的函数定义方式 function Show() { echo "hello"; } Show();//输出结果为he ...

  10. PHP基础语法&colon; echo&comma;var&lowbar;dump&comma; 常用函数:随机数:拆分字符串&colon;explode&lpar;&rpar;、rand&lpar;&rpar;、日期时间:time&lpar;&rpar;、字符串转化为时间戳:strtotime&lpar;&rpar;可变参数的函数:PHP里数组长度表示方法:count&lpar;&dollar;attr&lbrack;指数组&rsqb;&rpar;;字符串长度:strlen&lpar;&dollar;a&rpar;

    PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 a. 1.substr;  //用于输出字符串中,需要的某一部分 <?PHP $a="learn php"; ...

随机推荐

  1. PostCSS深入学习&colon; PostCSS和Sass、Stylus或LESS一起使用

    如果你喜欢使用PostCSS,但又不想抛弃你最喜欢的预处理器.不用担心,你不需要作出二选一的选择,你可以把PostCSS和预处理器(Sass.Stylus或LESS)结合起来使用. 有几个PostCS ...

  2. delphi 文件删除,复制

    这是个相对简单的方法,不知道能不能帮到你删除:procedure TForm1.Button1Click(Sender: TObject);begin deletefile('c:\123.txt') ...

  3. Swift的字符串String是值类型

    根据<The Swift Programming Language>中文版基于Xcode6.1的文章描述: Swift的 String 类型是值类型.如果创建了新的字符串,那么当其进行常量 ...

  4. 转:testlink 环境搭建(傻瓜版)

    testlink 环境搭建(傻瓜版) 2011-11-24 22:23 by 虫师, 12322 阅读, 4 评论, 收藏, 编辑 今天抽了点时间把testlink 环境搭建了一下,一直觉得这东西不怎 ...

  5. (转载)记录函数 getStyle&lpar;&rpar; 获取元素 CSS 样式

    设置元素(element)的css属性值可以用element的style属性,例如要将element的背景色设置为黑色,可以这么做: element.style.backgroundColor = ' ...

  6. WordPress Duplicator 0&period;4&period;4 Cross Site Scripting

    测试方法: 提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! Advisory ID: HTB23162 Product:DuplicatorWordPressPlugin Vend ...

  7. 201521123093 java 第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  8. vue cli 3&period;0创建项目

    .npm i -g @vue/cli .vue create my-project 此处有两个选择: 1.default (babel, eslint)默认套餐,提供babel和eslint支持 2. ...

  9. shell脚本定义输出字符颜色

    #-------------------定义输入颜色---------------------# RED='\033[1;31m' GREEN='\033[1;32m' YELLOW='\033[1; ...

  10. centos 7 下 nginx 1&period;10&period;3 编译安装的方法

    安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境. 一. gcc 安装安装 nginx 需要先 ...