zoukankan      html  css  js  c++  java
  • 通用的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文件和文件的依赖关系自动生成。

  • 相关阅读:
    将vue文件script代码抽取到单独的js文件
    git pull 提示错误:Your local changes to the following files would be overwritten by merge
    vue和uniapp 配置项目基础路径
    XAMPP Access forbidden! Access to the requested directory is only available from the local network.
    postman与newman集成
    postman生成代码段
    Curl命令
    POST方法的Content-type类型
    Selenium Grid 并行的Web测试
    pytorch转ONNX以及TnesorRT的坑
  • 原文地址:https://www.cnblogs.com/poonpan/p/9258634.html
Copyright © 2011-2022 走看看