做开发的特别是C/C++开发者一般都会用到Makefile,然而多数时候在公司做项目都不需要自己去写Makefile,仅仅停留在能看懂的基础上。因为make命令编译实在是太方便了,所以自己写写小项目用一用还是挺好的。网上关于Makefile教程也很多,总结一下近几年用到的常用脚本,方便自己查阅,如果能帮到别人那便是极好的_

单文件项目

其实一个文件的项目也没必要写Makefile了,哈哈。便于理解就先从最基础的开始吧,Makefile实际上就是写有gcc等编译链接语句的脚本,加上一些可以缩写这些语句的规则。
假设有hello.c文件。

all: Hello
Hello:gcc -o Hello hello.c
clean:rm -rf Hello

多文件项目

假设一个工程下,有main.c和有多个.c源文件以及同名的.h头文件,虽然可以类似上述例子一样把每条gcc语句都写出来,但是这么就太啰嗦了。可以使用一些Makefile自带的规则简化着写。

# 方便起见一般都会先定义编译器链接器
CC = gcc
LD = gcc# 正则表达式表示目录下所有.c文件,相当于:SRCS = main.c a.c b.c
SRCS = $(wildcard *.c)# OBJS表示SRCS中把列表中的.c全部替换为.o,相当于:OBJS = main.o a.o b.o
OBJS = $(patsubst %c, %o, $(SRCS))# 可执行文件的名字
TARGET = Hello# .PHONE伪目标,具体含义百度一下一大堆介绍
.PHONY:all clean# 要生成的目标文件
all: $(TARGET)# 第一行依赖关系:冒号后面为依赖的文件,相当于Hello: main.o a.o b.o
# 第二行规则:$@表示目标文件,$^表示所有依赖文件,$<表示第一个依赖文件
$(TARGET): $(OBJS)$(LD) -o $@ $^# 上一句目标文件依赖一大堆.o文件,这句表示所有.o都由相应名字的.c文件自动生成
%.o:%.c$(CC) -c $^# make clean删除所有.o和目标文件
clean:rm -f $(OBJS) $(TARGET)

多个文件,多个程序

这个用的比较少,网上的资料更少,当年我费了老大劲最终才找到这个方法。因为当时在一个目录下写了好多小程序,就是这个项目,可以点进去看一下。要把a.c/b.c/d.c都要编译成可执行文件a/b/c。

C_SRC = $(wildcard *.c)
C_OBJ = $(patsubst %c, %o, $(C_SRC))
# 目标文件也是多个
TARGETLIST = $(patsubst %.c, %, $(C_SRC)).PHONY:all clean
# 这句不写规则的语句可以自动把相应的a.c b.c编译成a b,神奇~
all:${TARGETLIST}clean:  rm -f ${TARGETLIST} *.o

指定头文件目录,库文件及目录

拿这个工程为例,工程需要用到libs目录下的libtomcrypt.a静态库和include目录下libtom的头文件。

CC = cc
LD = cc
SRCS = $(wildcard *.cpp)
OBJS = $(patsubst %cpp, %o, $(SRCS))
# -I指定头文件目录
INCLUDE = -I./include
# -L指定库文件目录,-l指定静态库名字(去掉文件名中的lib前缀和.a后缀)
LIB = -L./libs -ltomcrypt
# 开启编译warning和设置优化等级
CFLAGS = -Wall -O2TARGET = LibtomDemo.PHONY:all cleanall: $(TARGET)
# 链接时候指定库文件目录及库文件名
$(TARGET): $(OBJS)$(LD) -o $@ $^ $(LIB)# 编译时候指定头文件目录
%.o:%.cpp$(CC) -c $^ $(INCLUDE) $(CFLAGS) clean:rm -f $(OBJS) $(TARGET)

遍历执行子目录下的Makefile

有这么个应用场景,当前目录下有多个子目录,且每个子目录下都有独立的Makefile文件,相当于目录下有多个独立的工程,现在需要执行make把各个子目录下的工程全部编译。

.PHONY:all clean
# 排除目录
exclude_dirs := .git
# 显示深度为1的子目录
dirs := $(shell find . -type d -maxdepth 1)
# 去掉获取到目录名称前面的./
dirs := $(basename $(patsubst ./%, %, $(dirs)))
# 过滤指定目录
dirs := $(filter-out $(exclude_dirs), $(dirs))all:$(foreach N,$(dirs),make -C $(N);)
clean:$(foreach N,$(dirs),make -C $(N) clean;)

注意事项

  1. 规则语句前面是制表符TAB,写成空格会出错!
  2. 赋值符号:=基本赋值,:=覆盖之前的指,?=如果没有值则赋值,+=继续添加后面的值。

暂时没了,想到时候再补充,有任何问题欢迎留言讨论。

大型项目手写Makefile有点繁琐,建议使用cmake,可以参考 cmake CMakeLists.txt 常用模板。

Makefile常用模板相关推荐

  1. Makefile常用模板(静态链接库、动态链接库、可执行文件)

    本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链接库的makefile,生成动态链接库的makefile. 这些makefile都很简单,一般都是一看就会用,用法也很容 ...

  2. Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

    from: Makefile常用万能模板(包括静态链接库.动态链接库.可执行文件) 本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链接库的makefile,生成动态链接 ...

  3. Scons环境搭建和编译原理概述及嵌入式开发常用模板

    Scons环境搭建和编译原理概述及嵌入式开发常用模板 Scons是用python实现的一个类似makefile的软件构建工具.其官网是SCons: A software construction to ...

  4. html5常用模板下载网站

    html5常用模板下载网站 开创者素材.站长素材.模板之家 推荐葡萄家园素材网,他们网页模板栏目有个HTML模板,很多静态源码.应该是你所需要的. html静态页面模板 还是服饰素材啊 朋友 设计云 ...

  5. 雅思作文模板.html,雅思小作文常用模板万能句大全

    雅思小作文模板--柱状图 柱状图和线型图写法一致,并且结合饼状图来写! 表格题 1. 找出值,最小值,以及一般值 2. 进行分析比较,找出近似值和相差很大的数值 常用句式 1.a is nearly ...

  6. ros开发增加clion常用模板及初始化配置(六)

    ros开发增加clion常用模板及初始化配置(六) c++模板 cpp_regex正则匹配 #include <regex>Qstring checkcode="12312313 ...

  7. ros开发增加clion常用模板及初始化配置(五)

    ros开发增加clion常用模板及初始化配置(五) python模板 py_opencv_resize图片缩放_水平方向拉伸与左右截取 # 640 x 480 -> 1280 x 480(129 ...

  8. ros开发增加clion常用模板及初始化配置(四)

    ros开发增加clion常用模板及初始化配置(四) python模板 py_np_dot向量点乘 import numpy as np from math import sqrt# a与b点g乘得到一 ...

  9. ros开发增加clion常用模板及初始化配置(三)

    ros开发增加clion常用模板及初始化配置(三) python模板 py_math弧度转角度 import math DE2R = math.pi/180 #弧度=角度*DE2R py_unpack ...

  10. 软件测试实用技术与常用模板:内容提要

    内容提要 本书从软件测试实用理论和测试实训技术的角度出发, 以通俗易懂的语言讲述软件测试所需要的知识.并且以"手机信息管理系统模型"为测试软件平台,系统全面地对测试实用理论和实训技 ...

最新文章

  1. linux文件IO与内存映射:分散/聚集IO技术(scatter-gather)
  2. ubuntu开辟虚拟内存
  3. 字符串操作:索引位置、去空格、替换字符串
  4. 洛谷 P3803 多项式乘法
  5. 【SeeMusic】音符方块颜色设置 ( 单一颜色设置 | 多彩音符设置 | 定时变色设置 | 渐变颜色 | 分轨道提示 )
  6. IOS上的 Audio Memos SE 如何分享和传输录音到电脑?
  7. 指派问题(匈牙利算法)
  8. 多重信号辅助音频分离,让你在嘈杂环境也能指哪听哪儿
  9. [摘录]调动员工积极性的七个关键
  10. cmd 文本文件分割_通过split命令分割大文件
  11. 生化危机5显示无法连接服务器,《生化危机5》黄金版无法联机怎么办?
  12. 看看阿里双十一970P数据处理得,那叫一个牛啤!
  13. html中target四种选择_blank、_parent、_self、_top,分别是什么意思?
  14. 【历史上的今天】4 月 28 日:人工智能理论之父出生;大众点评上线;苹果开设 iTunes 音乐商店
  15. 暗黑类游戏的设计概念
  16. 雨棚板弹性法计算简图_雨棚板的计算书
  17. Ubuntu apt install / update错误前因后果: 连接失败 [IP: 91.189.91.* 80]
  18. 数字化营销3大趋势:全域、全链路、全闭环
  19. 计算机网络常见缩略语
  20. 数据库操作--已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行

热门文章

  1. python编辑视频教程_Maya中Python编辑基础核心技术训练视频教程
  2. POI导入Excel文档试题案例
  3. 物理学 物体的运动力学分析之牛顿三定律 单摆的MATLAB运动仿真(一)
  4. 为何AD快捷键不起作用
  5. 计算机usb接口失灵,电脑usb接口没反应,教您电脑usb接口没反应怎么解决
  6. 计算机主机机箱结构图,带大家认识电脑主机拆开,内部结构
  7. 《Total Commander:万能文件管理器》——第7.2节.比较和同步文件夹
  8. Windows批处理:命令echo 和 @
  9. 搜索中的深度匹配模型
  10. ERStudio 8.0 连接Oracle进行反向工程