最近要搞 linux 下 c++ 开发,花了几天时间学习了一下 makefile. 总结了一点自己平时会用的比较多的东西。首先是多目录下嵌套调用 makefile. 我觉得这个很重要。很多时候自己写测试代码或者做一些预研的时候都要用到。
我这个演示例子采用了一个平时我用的比较多的目录结构,相信大家应该也常会用到与此类似的目录结构。今天写这篇文章希望能对正在查相关资料的同行有所帮助。我保证这篇文章里的所有代码都经过充分测试。
首先贴目录结构图:
这个目录里面,源文件的目录有两个:分别是 my_str_utils 和 xtests. my_str_utils 目录里面主要是写了一些函数的声明和实现,头文件都放在 my_str_utils/headers 里面,对应的源文件都放在 my_str_utils/source 里面,。而 xtests 里面放了个 main.cpp 用来测试 my_str_utils 中写的函数。我把目标文件单独放在 xdirObjs 中,这样目录会整洁很多。最后的可执行程序我单独放在了 xdirExecs 中。
在每个有源文件的目录里都写了一个 Makefile, 用于编译当前目录下的 Makefile. 在 xdirObjs 目录里写了一个 Makefile 用于链接目标文件并生成可执行文件。最后在工程的根目录里写了一个 Makefile 用于发出 make 指令,启动编译过程。
下面是各个目录中的 Makefile 文件。我就不用太多的文字来描述了。但注释会非常详细。
首先是项目根目录下的 Makefile 的代码:
.PHONY: all clean
# 可执行文件名, 这个根据具体程序会有变动。
EXEC_FINAL := tests.exe
# 子目录可以有多个, 以空格分开即可,这个会根据具体程序有所变动。
# 注意 xdirObjs 目录要和 DIR_OBJS 中定义的一致。
SUBDIRS := my_str_utils/source \
xtests \
xdirObjs
# 当前目录
DIR_TOP := $(shell pwd)
# 定义变量(有的书上也叫宏),指定 object 文件的文件夹和可执行文件的文件夹。
DIR_OBJS := $(DIR_TOP)/xdirObjs
DIR_EXEC := $(DIR_TOP)/xdirExecs
# 我这里由需要在 DIR_OBJS 目录中放一个 Makefile 文件,所以 DIR_OBJS 目录已经事
# 先创建好,这里就不再创建了。
DIRS := $(DIR_EXEC)
# 定义变量
CC = g++
#