一个C++项目的makefile

makefile

makefile语法知识

在开始写makefile之前需要了解一些基本的语法知识

常见语法

= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

$@  表示目标文件
$^  表示所有的依赖文件
$<  表示第一个依赖文件
$?  表示比目标还要新的依赖文件列表

@echo "hello" 命令前面加了@符号,则不显示命令本身而只显示结果。
-rm xxx 命令前面加上“-”,即使这条命令出错,makefile也会继续执行后续命令的

常见函数

wildcard : 扩展通配符

  • 在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法:$(wildcard PATTERN...)

  • 在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空

  • 一般我们可以使用$(wildcard *.c)来获取工作目录下的所有的.c文件列表。

  • 可以使用$(patsubst %.c, %.o, $(wildcard *.c)),首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。

notdir : 去除路径

patsubst :替换通配符

addprefix:增加前缀

$(addprefix fixstring,string1 string2 ...) fixstring表示任意要添加的固定前缀,在逗号的后面可以是一个或多个要添加前缀的子字符串,多个子字符串之间用空格隔开,在每个字符串前增加前缀

basename:取.之前的

$(basename src/foo.c src-1.0/bar.c /home/jack/.font.cache-1 hacks)

返回值为:“src/foo src-1.0/bar /home/jack/.font hacks”

foreach

$(foreach x, data, func) 对于data中的每个数据x,执行func

简单实现

需求

  1. 自动编译当前目录下的所有源文件

获得所有源文件

源文件->.o

.o -> target

clean

总结

这样一个简单的makefile 就完成了,具备编译当前目录下所有 cpp 文件的功能,整体如下

这个写一些简单的程序足够了,但是各个文件混在一起,比较混乱,如果要用到第三方库,也没法指定,接下来写一个完整的,目录结构清晰的。

完整makefile

需求

  1. 可以指定头文件目录

  2. 可以指定静态库目录和需要链接的静态库

  3. 统计编译时间

实现

一个简单C++项目的makefile就这么多了,网上一些其他项目的makefile动辄几百行,各种include,函数,看着就比较复杂,自己写的话暂时还不需要那么复杂,只要懂一些基本的就够用了,如果项目过于复杂,用cmake可能会更好一点

最后更新于

这有帮助吗?