转 http://blog.csdn.net/chilv/article/details/79075824
我们先看三段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.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
- target:components
- rule
比如说我们上面的那个Makefile文件的前面二行:
- main.out:main.o line1.o line2.o
- g++ -o main.out main.o line1.o line2.o
接下来我来介绍下Makefile中的四个有用的特殊符号意义和使用,他们分别是@、$@、$^、$<
一、@
这个符串通常用在“规则”行中,表示不显示命令本身,而只显示它的结果,例如Makefile中的内容为:
- DIR_OBJ=./obj
- CMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi
- mkobjdir:
- @${CMD_MKOBJDIR}
- make mkobjdir
二、$@、$^、$<
这三个分别表示:
$@ --代表目标文件(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 $<