zoukankan      html  css  js  c++  java
  • Makefile的编写及四个特殊符号的意义@、$@、$^、$<

    我们先看三段C++程序:

    一、line1的源码

    line1.h

    1 #ifndef _LINE_1_H 
    2 #define _LINE_1_H 
    3     void line1_print(const char *strMsg);
    4 #endif
    View Code

    line1.cpp

    1 #include "line1.h"
    2 #include <stdio.h>
    3 void line1_print(const char *strMsg)
    4 {
    5     printf("This is line1 print %s.
    ",strMsg);
    6 }
    View Code

    二、line2的源码

    line2.h

    1 #ifndef _LINE_2_H 
    2 #define _LINE_2_H 
    3     void line2_print(const char *strMsg);
    4 #endif
    View Code

    line2.cpp

    1 #include "line2.h"
    2 #include <stdio.h>
    3 void line2_print(const char *strMsg)
    4 {
    5     printf("This is line2 print %s.
    ",strMsg);
    6 }
    View Code

    三、main的源码

    main.cpp

     1 #include "line1.h"
     2 #include "line2.h"
     3 
     4 int main(int argc,char **argv)
     5 {
     6     line1_print("hello runfarther");
     7     line2_print("hello runfarther");
     8     
     9     return 0;
    10 }
    View Code

    对上面的代码,在不用Makefile时,我们可以直接用命令行来编译,得到我们的可执行程序main.out:

    g++ -c main.c 
    g++ -c line1.c 
    g++ -c line2.c 
    g++ -o main.out main.o line1.o line2.o
    

     为了编译工作更加方便,我们通常会编写Makefile来完成编译,我们先看一个用于编译和链接上面代码的例子:

    main.out:main.o line1.o line2.o
    	g++ -o main.out main.o line1.o line2.o
    main.o:main.c line1.h line2.h
    	g++ -c main.c
    line1.o:line1.c line1.h
    	g++ -c line1.c
    line2.o:line2.c line2.h
    	g++ -c line2.c
    

     从例子可以看出,Makefile一般的格式是:

    target:components 
    	rule
    

     第一行表示的是依赖关系,第二行是规则,特别要注意,rule这行必须是TAB键开头。 比如说我们上面的那个Makefile文件的前面二行:

    main.out:main.o line1.o line2.o
        g++ -o main.out main.o line1.o line2.o
    

     表示我们的目标(target)main.out的依赖对象(components)是main.o line1.o line2.o,当依赖的对象在被修改的话,就要去执行规则一行所指定的命令g++ -o main.out main.o line1.o line2.o。注意规则这行是以一个TAB键开头。

    接下来我来介绍下Makefile中的四个有用的特殊符号意义和使用,他们分别是@、$@、$^、$<

    一、@

    这个符串通常用在“规则”行中,表示不显示命令本身,而只显示它的结果,例如Makefile中的内容为:

    DIR_OBJ=./obj
    CMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi
    
    mkobjdir:
    	@${CMD_MKOBJDIR}
    

     命令行执行如下:

    make mkobjdir
    

     此时不会显示在命令行不会显示出if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi,但如果规则行的TAB后没有以@开头,则会显示,不信可以试试。

    二、$@、$^、$<

    这三个分别表示:

    $@          --代表目标文件(target)

    $^            --代表所有的依赖文件(components)

    $<           --代表第一个依赖文件(components中最左边的那个)。

    好了,知道了他们的意义后,如果使用上面三个变量,那么简化的Makefile文件为:

    main.out:main.o line1.o line2.o
    	g++ -o $@ $^
    main.o:main.c line1.h line2.h
    	g++ -c $<
    line1.o:line1.c line1.h
    	g++ -c $<
    line2.o:line2.c line2.h
    	g++ -c $<
    

     当然,还可以进一步简化,有兴趣可以再去研究下,这里就不展示了。

  • 相关阅读:
    转载:CODE CSDN Git 配制方法介绍
    版本管理之Git(二):Win7上Git安装及简单配置过程
    Html_color code表示
    Android 自动化测试—robotium(十一) robotium实现微博绑定
    转载:Android自动化测试- 自动获取短信验证码
    Android 自动化测试—robotium(九) Junit_report测试报告重定向输出到终端SDCard
    每日一问:面试结束时面试官问"你有什么问题需要问我呢",该如何回答?
    常见的几个Python面试题
    使用python解析Json字符串-获取Json字符串关键字
    Android测试之 APK重签名方法
  • 原文地址:https://www.cnblogs.com/wind8961/p/5027875.html
Copyright © 2011-2022 走看看