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 命令参数。


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


  • 相关阅读:
    Xposed模块开发基本方法记录
    Win8.1下运行环境/配置问题解决方案总结
    wordpress安装记录
    编译时:virtual memory exhausted: Cannot allocate memory
    Support for AMD usage of jwplayer (require js)
    UC 浏览器远程调试手机web网页记录
    手机浏览器页面点击不跳转(Android手机部分浏览器) 浏览器双击放大网页 解决
    aes 加密,解密(2)
    aes 加密,解密
    ionic 安装步骤
  • 原文地址:https://www.cnblogs.com/diylab/p/1168026.html
Copyright © 2011-2022 走看看