zoukankan      html  css  js  c++  java
  • makefile中的使用 VAPTH 和“自动变量”指定目标文件的存放目录

     


    The value of the make variable VPATH specifies a list of directories that make should search. Most often, the directories are expected to contain prerequisite files that are not in the current directory; however, make uses VPATH as a search list for both prerequisites and targets of rules.
                                                                                        --《GNU make》, Version 3.81  4.4.1 《VPATH: Search Path for All Prerequisites》
     "VPATH" 变量指定了一个供make 搜索的目录列表。通常理解,这些目录服务于依赖文件,它包含了不在当前目录而又被目标文件所依赖的文件。然而,make 将这个目录列表同时应用于依赖文件和目标文件。
                                                                                           --《GUN make 手册》4.4.1 《VPATH:依赖文件的搜索路径》

     

     
    需求描述:
    一个项目中有两个类Main和Pub,生成的可执行文件为winner。其文件分布结构如下:


    我们希望,无论pub移动到哪里,在makefile中做尽量少的修改。
    最简单的makfile文件内容如下:

     

    CC                       = g++
    COMPILE.C            = $(CC) -c

    MAKEEXE              = $(CC) $(LDFLAGS)

    OBJ                     = main.o ../pub/b.o
    EXE                     = winner

    all:                      $(EXE)

    $(EXE):                ${OBJ}
                              $(MAKEEXE) $(OBJ) -o $(EXE)
    main.o:                   main.cpp
                              $(COMPILE.C) main.cpp -o main.o

    ../pub/b.o:           ../pub/b.cpp
                              $(COMPILE.C) ../pub/b.cpp -o ../pub/b.o
    clean:           
                              rm -f *.o $(EXE) core



    上面的makefile使用了三次路径。修改起来很麻烦。我们可以通过使用“虚拟路径”(VPATH)和"自动变量"对其进行优化。
    经过优化的 makefile 文件如下:

    CC                         = g++
    COMPILE.C               
    = $(CC) -c 
    VPATH                     
    = ../pub
    MAKEEXE                   
    = $(CC) $(LDFLAGS)

    OBJ                       
    = main.o ../pub/b.o
    EXE                       
    = winner

    all:                      $(EXE)

    $(EXE):                   ${OBJ}
                              $(MAKEEXE) $< -o $@
    main.o:                   main.cpp
                              $(COMPILE.C) $< -o $@
    b.o:                      b.cpp
                              $(COMPILE.C) $< -o $@
    clean:            
                              rm -f *.o $(EXE) core 

     

    解释:

    VPATH用于依赖检查。
    上面的"$^","$@"称做“自动变量”。(automatic variables)“自动变量”用于shell 命令参数。


    范晨鹏
    ------------------
    软件是一种态度
    成功是一种习惯


  • 相关阅读:
    我的java学习之路--Reflect专题
    jQuery——动态给表格添加序号
    jQuery操作表格(table)的常用方法、技巧汇总
    Jquery如何删除table里面checkbox选中的多个行
    Mybatis问题:There is no getter for property named 'unitId' in 'class java.lang.String'
    jquery 遍历表格,需要表格中每个td的内容
    用jquery怎么删除<table>的一行
    xml报错 Parse Fatal Error :在实体引用中,实体名称必须紧跟在'&'后面
    mybatis做like模糊查询
    javascript eval和JSON之间的联系
  • 原文地址:https://www.cnblogs.com/diylab/p/1168026.html
Copyright © 2011-2022 走看看