7

一个通用的makefile写法,自动推导文件的依赖关系

 3 years ago
source link: https://blog.csdn.net/china_video_expert/article/details/70163545
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一个通用的makefile写法,自动推导文件的依赖关系

reprint.png
叶广明_微信ye_guangming 2017-04-13 23:40:03 articleReadEyes.png 1533
分类专栏: C语言进阶
温习之用。

    假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录

 写一个完整的makefile步骤如下:

1 定义可执行文件的名称

 TARGET =MyPro               

2 指定此编译工程所要使用的头文件所在的目录

 INC = -I. -Iheader1 -Iheader2

3 指定cpp文件所在的目录

 VPATH = .:src1:src2

4 指定所有的cpp文件

   SRC_PATH = $(foreachdir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/,*.cpp))

 foreach,subst,wildcard为makefile的内置函数,其中wildcard函数为字符串连接函数,把函数中的两个参数连接成一个subst是字符串替换函数,在此句中意思是把VPATH变量中的冒号替换成空格。foreach函数,就是把subst函数的返回值,以空格为分隔符,循环取值赋给dir,然后接受wildcard的处理

 这句的总体意思是:从VPATH中获取每个目录,并分别找出此目录下所有的cpp文件,赋给SRC_PATH变量。

5 定义中间object文件存放的目录。

 OBJ_DIR = ./obj

6 所有的object文件要按照和源代码对应的目录存放,定义object文件的目录

 OBJ_PATH = $(addprefix $(OBJ_DIR)/,   $(subst :,,$(VPATH) )  )

 addprefix函数是加前缀的函数,词句中是给VPATH中所有已经定义的目录加上./obj/的前缀

7 定义连接成目标文件所需要的所有的object文件的名称

 OBJS = $(addprefix $(OBJ_DIR),$(subst.cpp,.o,$(SRC_PATH)))

8 创建一个object文件的目录

 MAKE_OBJECT_DIR := $(shell mkdir -p $(OBJ_DIR)$(OBJ_PATH))

************************* 

9 定义实用的编译器

 CXX = g++

 CXXFLAGS = -g

10 定义目标文件的生成规则

 $(TARGET) : $(OBJS)

  $(CXX) -o $@ $(OBJS) $(INC)$(CXXFLAGS)

11 定义object文件的生成方式:

 $(OBJ_DIR)/%.o : %.cpp%.cpp.d

  $(CXX) -o $@ -c$< $(INC) $(CXXFLAGS)

12 定义.cpp.d文件的生成方式

 DEPS = $(OBJS:.o=.cpp.d)

 $(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp

  $(CXX) $< -MM$(INC) > $(OBJ_DIR)/$<.d

13 定义清理函数

 clean:

    @rm -rf./obj

    @rm -rf$(TARGET)

   至此,一个通用的makefile完成了,如果增加源代码目录和头文件目录,只需要在INC变量和VPATH变量处加上此目录即可。中间object文件和文件的依赖关系自动生成


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK