makefile 编写要点
PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
前置说明
本文作为本人csdn blog的主站的备份。(BlogID=015)
本文发布于 2016-05-08 00:19:12,现用MarkDown+图床做备份更新。blog原图已从CSDN图片服务器下载。(BlogID=015)
环境说明
无
前言
最近整理自己的文件时,发现由于太懒的原因,很多资料都来不及整理就忘掉了,很可惜,所以,在整理Makefile时,就把自己作为新手,编写makefile的一些疑问立即写下来.
编写要点
1 变量赋值
- varname= 是最基本的赋值
- varname:= 是覆盖之前的值
- varname?= 是如果没有被赋值过就赋予等号后面的值
- varname+= 是添加等号后面的值
2 几个特殊符号的意义
- $@--目标文件,
- $^--所有的依赖文件,
- $<--第一个依赖文件。
3 多目录makefile编写要点
- 用命令: ${MAKE} -C ${子目录} $
- 注释:以上命令会切换到子目录,并执行make命令
- 在子目录建立makefile,做好依赖工作
4 makefile部分函数使用
patsubst(<pattern>,<replacement>,<text>)
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“%”来表示真实含义的“%”字符)返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o,tmp.c.c tmp1.c)
把字串“tmp.c.c tmp1.c”符合模式[%.c]的单词替换成[%.o],返回结果是“tmp.c.o tmp1.o”
$(strip <string> )
功能:去掉<string>字串中开头和结尾的空字符。
返回:返回被去掉空格的字符串值。
示例:
$(strip abc )
把字串“ abc ”去到开头和结尾的空格,结果是“abc”。
${wildcard <partner>)
功能:src = $(wildcard *.c )
返回:搜索当前目录下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC.当前目录文件只有文件名,子目录下的文件名包含路径信息
${notdir textlist)
使用:src = $(notdir textlist)
返回:去除所有的目录信息,SRC里的文件名列表将只有文件名。
我的makefile实例
我的makefile实例:
topdir-makefile:
##############################
# file: Makefile
# author: sky
# modified-date: 2016-05-07
###############################
export ROOT_DIR := $(shell pwd)
#get out of start and end char' ' of the string
ROOT_DIR :=$(strip ${ROOT_DIR})
export LIB_DIR:=$(ROOT_DIR)/lib
export SRC_DIR:=$(ROOT_DIR)/src
export INCLUDE_DIR:=$(ROOT_DIR)/include
export TARGET:=test
export CC:=gcc
export LD_FLAGS:=-l config -pthread
export SRC:=$(wildcard ${SRC_DIR}/*.c)
export OBJ:=$(patsubst %.c,%.o,${SRC})
export OBJ_S:=Y_Start.o Y_ChildProcess.o
#if you want to build release-program , use command: make BUILD_RELEASE=TRUE
ifeq ($(BUILD_RELEASE), TRUE)
export C_FLAGS:= -I ${INCLUDE_DIR} -std=c99
export BUILD_DIR := $(ROOT_DIR)/release
else
export C_FLAGS:= -g -D Y_DEBUG -I ${INCLUDE_DIR} -std=c99
export BUILD_DIR := $(ROOT_DIR)/debug
endif
export OLD_OBJ:=$(wildcard ${BUILD_DIR}/*.o)
.PHONY :default all clean
default:all
all :
@${MAKE} -C src all
clean:
@${MAKE} -C src clean
sub-dir-makefile:
.PHONY:all clean
all:${TARGET}
@${CC} ${OBJ} -o ${TARGET} ${LD_FLAGS}
@mv ${TARGET} ${BUILD_DIR}
@mv ${OBJ} ${BUILD_DIR}
#this is to make test from a static-lib
test_static:${OBJ}
@${CC} ${C_FLAGS} ${OBJ_S} -o test_static -static -L ${LIB_DIR} -l Y_Stdio
#this is to make test from a shared-lib
test_share:${OBJ}
@${CC} ${C_FLAGS} ${OBJ_S} -o test_share -L ${LIB_DIR} -l Y_Stdio
#this is to make a static-lib
libY_Stdio_Static:
@${CC} ${C_FLAGS} -c Y_Stdio.c
@ar -rcs libY_Stdio.a Y_Stdio.o
@mv libY_Stdio.a ${LIB_DIR}
#this is to make a shared-lib
libY_Stdio_Shared:
@${CC} ${C_FLAGS} -fPIC -c Y_Stdio.c
@${CC} -shared -fPIC -o libY_Stdio.so Y_Stdio.o
@mv libY_Stdio.so ${LIB_DIR}
${TARGET}:
@${CC} ${C_FLAGS} -c ${SRC}
#clean target
clean:
@rm ${OLD_OBJ} ${BUILD_DIR}/${TARGET}
纯手打,难免有出错之处,欢迎指正。
后记
无。
参考文献
无。
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
makefile 编写要点的更多相关文章
- makefile编写要点
1.wildcard : 扩展通配符 2.notdir : 去除路径 3.patsubst :替换通配符 格式:$(patsubst <pattern>,<replacement&g ...
- Yocto开发笔记之《Makefile编写》(QQ交流群:519230208)
开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...
- Make和Makefile编写(详见GCC手册)
Makefile和Make Rules 多模块软件.依赖树和Make 默认规则 Make使用程序对简单变量的支持 内建变量 虚目标 特殊目标 一般性语法错误及其纠正措施 命令行的使用和调试 Makef ...
- linux 下C语言编程库文件处理与Makefile编写
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
- 单目录下多文件 makefile编写
makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东 ...
- linux --> Makefile编写
Makefile编写 单目录 测试程序在同一个文件中,共有func.h.func.c.main.c三个文件,Makefile写法如下所示: CC = gcc CFLAGS = -g -Wall mai ...
- Linux——makefile编写
以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐.在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理, ...
- 如何将多个C文件链接在一起----Makefile编写及make指令
需使用GCC编译器,关于MinGW的安装指南:https://people.eng.unimelb.edu.au/ammoffat/teaching/20005/Install-MinGW.pdf 单 ...
- Windows 下的 Makefile 编写
Windows 下的 Makefile 编写(一)Makefile的基本规则 作者:cntrump Makefile对于很多人来说是陌生的,特别是习惯于使用 IDE 的人来说,似乎没有听说过 Make ...
- [动态库]动态库生成和使用以及Makefile编写
转自:https://www.cnblogs.com/ljtknowns/p/5647793.html 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc ...
随机推荐
- HBase-HBase的特征、优缺点、应用场景
一.Hbase的概念 HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式.面向列的数据库,通过利用Hadoop的文件系统提供容错能力.如果你需要进行实时读写或者随 ...
- 【译】使用.NET将WebAssembly扩展到云(二)
原文 | Richard Lander 翻译 | 郑子铭 轻量级功能 嗯--但是如果我们使用 Wasm 更像是一个典型的功能而不是一个应用程序,我们可能不会计算一百万个单词,而是做一些更轻量级的事情. ...
- NC17508 指纹锁
题目链接 题目 题目描述 HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁. 该指纹锁的加密算法会把一个指纹转化为一个不超过1e7的数字,两个指纹数值之差越小,就说明两 ...
- 【framework】Task简介
1 前言 Task 即任务,一个 Task 对应一个 Activity,其父容器为 TaskStack,子容器为 AppWindowToken. 关于其父类及祖父类的介绍,见 → Window ...
- Vue+SpringBoot+ElementUI实战学生管理系统-2.搭建Vue+elementUI脚手架
1.项目介绍 前一片介绍了项目的整体情况,这一篇开始搭建前端工程,需要的朋友可以拿去自己定制.:) 2.获取源码 源码是捐赠方式获取,详细请QQ联系我 :)! 3.项目截图 登录页 列表操作 动态图 ...
- EnumColorProfiles WcsGetDefaultColorProfile WcsSetDefaultColorProfile的使用
#include <Windows.h> #include <Icm.h> #include <iostream> #include <string> ...
- leetcode - 中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 . 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 ...
- SpringBoot事务注解@Transactional 事物回滚、手动回滚事物
处理springboot 下提交事务异常,数据库没有回滚的问题. spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作. 什么 ...
- pytho代码分析示例
a = 5 b = 6 c = 10 for i in range(n): for j in range(n): x = i * j y = j * j z = i * j for k in rang ...
- 【Azure 应用服务】Azure Function HTTP Trigger 遇见奇妙的500 Internal Server Error: Failed to forward request to http://169.254.130.x
问题描述 使用 Azure Funciton App,在本地运行完全成功的Python代码,发布到Azure Function就出现了500 Internal Server Error. 而且错误消 ...