Linux下Makefile的编写及四个特殊符号的意义@、$@、$^、$<

来源:互联网 发布:飞扬软件 编辑:程序博客网 时间:2024/05/09 23:11

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

一、line1的源码

line1.h

#ifndef _LINE_1_H #define _LINE_1_H void line1_print(const char *strMsg);#endif

line1.cpp

#include "line1.h"#include <stdio.h>void line1_print(const char *strMsg){printf("This is line1 print %s.\r\n",strMsg);}

二、line2的源码

line2.h

#ifndef _LINE_2_H #define _LINE_2_H void line2_print(const char *strMsg);#endif

line2.cpp

#include "line2.h"#include <stdio.h>void line2_print(const char *strMsg){printf("This is line2 print %s.\r\n",strMsg);}

三、main的源码

main.cpp

#include "line1.h"#include "line2.h"int main(int argc,char **argv){line1_print("hello runfarther");line2_print("hello runfarther");return 0;}

对上面的代码,在不用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.og++ -o main.out main.o line1.o line2.omain.o:main.c line1.h line2.hg++ -c main.cline1.o:line1.c line1.hg++ -c line1.cline2.o:line2.c line2.hg++ -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=./objCMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fimkobjdir:@${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.og++ -o $@ $^main.o:main.c line1.h line2.hg++ -c $<line1.o:line1.c line1.hg++ -c $<line2.o:line2.c line2.hg++ -c $<
当然,还可以进一步简化,有兴趣可以再去研究下,这里就不展示了。










0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机总是弹出日历已停止运行怎么办 华为mate8忘了锁屏密码怎么办 红米4a打王者卡怎么办 苹果5s软件更新密码忘记了怎么办 华为荣耀P9进水了没有声音怎么办 华为荣耀7原相机不能拍照怎么办 华为手机触屏密码忘记了怎么办 华为荣耀10屏锁密码忘了怎么办 华为手机开机卡在开机界面怎么办 苹果6s国行不能用移动4g怎么办 苹果手机32g内存不够用怎么办 华为荣耀6x忘记了密码怎么办 百度粉色衣服被洗变色了怎么办 粉色衣服放进洗衣机洗变色了怎么办 红米note5a应用锁忘了怎么办 索尼手机死机了怎么办不可拆卸电池 华为手机一直停留在开机画面怎么办 5s用11.4太卡了怎么办 华为荣耀5a手机声音小怎么办 牙签卡在手机插卡针里怎么办 捡的华为手机账号激活不了怎么办 华为平板激活手机密码忘了怎么办 捡个华为手机非要激活才能用怎么办 华为手机没激活想重新激活怎么办 华为手机激活总显示系统繁忙怎么办 华为荣耀7i进水了不开机怎么办 华为荣耀手机进水了怎么办开不开机 华为畅享5s变砖怎么办 我的苹果7机身内存满了怎么办 小米5x拆机后屏幕翘边怎么办 苹果手机设备禁止游戏登入怎么办 苹果7plus玩游戏掉频怎么办 孕期牙套子掉了基牙烂掉了怎么办 美团绑定的信用卡过期了怎么办 苹果6s手机开不开机怎么办 换了散热硅胶后还是死机怎么办 华为畅享6s掉啦怎么办 透明塑料壳被太阳晒的发黄怎么办 新买的手机壳有味道怎么办 刚买的手机壳有异味怎么办 bjd 光油把妆蹭掉了一点怎么办