Linux下Makefile的编写及四个特殊符号的意义@、$@、$^、$<
2017-11-21 15:26
483 查看
我们先看三段C++程序:
一、line1的源码
line1.h
[cpp] view
plain copy
#ifndef _LINE_1_H
#define _LINE_1_H
void line1_print(const char *strMsg);
#endif
line1.cpp
[cpp] view
plain copy
#include "line1.h"
#include <stdio.h>
void line1_print(const char *strMsg)
{
printf("This is line1 print %s.\r\n",strMsg);
}
二、line2的源码
line2.h
[cpp] view
plain copy
#ifndef _LINE_2_H
#define _LINE_2_H
void line2_print(const char *strMsg);
#endif
line2.cpp
[cpp] view
plain copy
#include "line2.h"
#include <stdio.h>
void line2_print(const char *strMsg)
{
printf("This is line2 print %s.\r\n",strMsg);
}
三、main的源码
main.cpp
[cpp] view
plain copy
#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:
[plain] view
plain copy
g++ -c main.c
g++ -c line1.c
g++ -c line2.c
g++ -o main.out main.o line1.o line2.o
为了编译工作更加方便,我们通常会编写Makefile来完成编译,我们先看一个用于编译和链接上面代码的例子:
[plain] view
plain copy
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一般的格式是:
[html] view
plain copy
target:components
rule
第一行表示的是依赖关系,第二行是规则,特别要注意,rule这行必须是TAB键开头。
比如说我们上面的那个Makefile文件的前面二行:
[plain] view
plain copy
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中的内容为:
[plain] view
plain copy
DIR_OBJ=./obj
CMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi
mkobjdir:
@${CMD_MKOBJDIR}
命令行执行如下:
[html] view
plain copy
make mkobjdir
此时不会显示在命令行不会显示出if
[ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi,但如果规则行的TAB后没有以@开头,则会显示,不信可以试试。
二、$@、$^、$<
这三个分别表示:
$@ --代表目标文件(target)
$^ --代表所有的依赖文件(components)
$< --代表第一个依赖文件(components中最左边的那个)。
好了,知道了他们的意义后,如果使用上面三个变量,那么简化的Makefile文件为:
[plain] view
plain copy
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 $<
当然,还可以进一步简化,有兴趣可以再去研究下,这里就不展示了。
一、line1的源码
line1.h
[cpp] view
plain copy
#ifndef _LINE_1_H
#define _LINE_1_H
void line1_print(const char *strMsg);
#endif
line1.cpp
[cpp] view
plain copy
#include "line1.h"
#include <stdio.h>
void line1_print(const char *strMsg)
{
printf("This is line1 print %s.\r\n",strMsg);
}
二、line2的源码
line2.h
[cpp] view
plain copy
#ifndef _LINE_2_H
#define _LINE_2_H
void line2_print(const char *strMsg);
#endif
line2.cpp
[cpp] view
plain copy
#include "line2.h"
#include <stdio.h>
void line2_print(const char *strMsg)
{
printf("This is line2 print %s.\r\n",strMsg);
}
三、main的源码
main.cpp
[cpp] view
plain copy
#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:
[plain] view
plain copy
g++ -c main.c
g++ -c line1.c
g++ -c line2.c
g++ -o main.out main.o line1.o line2.o
为了编译工作更加方便,我们通常会编写Makefile来完成编译,我们先看一个用于编译和链接上面代码的例子:
[plain] view
plain copy
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一般的格式是:
[html] view
plain copy
target:components
rule
第一行表示的是依赖关系,第二行是规则,特别要注意,rule这行必须是TAB键开头。
比如说我们上面的那个Makefile文件的前面二行:
[plain] view
plain copy
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中的内容为:
[plain] view
plain copy
DIR_OBJ=./obj
CMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi
mkobjdir:
@${CMD_MKOBJDIR}
命令行执行如下:
[html] view
plain copy
make mkobjdir
此时不会显示在命令行不会显示出if
[ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi,但如果规则行的TAB后没有以@开头,则会显示,不信可以试试。
二、$@、$^、$<
这三个分别表示:
$@ --代表目标文件(target)
$^ --代表所有的依赖文件(components)
$< --代表第一个依赖文件(components中最左边的那个)。
好了,知道了他们的意义后,如果使用上面三个变量,那么简化的Makefile文件为:
[plain] view
plain copy
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 $<
当然,还可以进一步简化,有兴趣可以再去研究下,这里就不展示了。
相关文章推荐
- Linux下Makefile的编写及四个特殊符号的意义@、$@、$^、$<
- Makefile的编写及四个特殊符号的意义@、$@、$^、$<
- Makefile中一些特殊符号的意义
- Makefile 中一些特殊符号的意义
- Makefile中一些特殊符号的意义
- Linux下gSOAP的安装及使用<测试>及MakeFile 文件的编写
- Makefile中一些特殊符号的意义
- Linux C/C++ 多目标文件的链接及其Makefile编写($<与$^)
- linux下的C语言开发(makefile编写)
- Linux中特殊符号的功能
- 从简入难makefile文件编写,Linux C++编程,简单vi命令
- linux文件属性、特殊符号、通配符、通配符与正则的区别
- linux特殊符号大全
- Linux中gcc,g++常用编译选项以及makefile的编写
- Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义
- 通俗讲解Makefile编写方法<2>
- ARM指令中特殊符号意义
- 删除Linux中的特殊符号文件及目录
- Linux中的特殊符号与正则表达式
- Linux下makefile的编写