Makefile 是大型项目开发必非常好的编译控制方法,makefile 的语法是有一些make file 语句和shell 命令构成的,说白了就是一些依赖和目标文件的相互之间的一种编译关系。下面我们举详细介绍一下makefile的写法和使用技巧。
1. 变量的声明和shell脚本一样没有类型的声明只有变量名的声明,例如 OBJS
2. 一些 特殊符号的介绍:
$ 变量引用符号, $@ 目标文件,$< 文件夹下的第一个依赖文件, $^ 文件夹下的所有依赖文件
3. 一些常用的变量的介绍:
OBJS= 所有目标
CFLAGS= 编译选项,-O 优化的级别,O1 O2 O3 -fPIC 编译与位置无关的程序,-Wall 显示警告信息 -g gdb可调式选项
INCLUDES= 头文件集合
LIBS= 需要的依赖库的集合
4. 一些简单常见的makefile 命令的介绍:
include xxx.mk include别的make file 文件。
-I 指定include头文件搜素的路径, -i 指定include到某个具体的文件, -L 指定链接库的搜素路径,-l 连接到某个具体库文件名
make -C 指定make执行的路径,
静态库生成命令 ar rcvs libname.a *.o 动态库生成命令 gcc -shared -o libname.so *.o
export 关键字是修饰全局变量的全工程可用。
@echo 输出不回显的输出(命令本身不会输出)
5. makefile中的for循环使用
@for i in $(SUBDIR); do\
make -C $$i || exit 1 ;\
done
6. make file中shell 命令的应用, 在makefile中shell命令必须在target 中出现否则是没有作用的,在makefile只能够每一行shell脚本就是一个独立的shell运行单元,所以要想在makefile中运行一组有联系的shell脚本必须在每个命令结束或加;\ 保证这些命令在一行内。还有在shell中传入makefile中的变量需要用$$
7 . 虚拟目标的用法和作用
.PHONY: clearn
rm -rf $(targes)
这个主要是防止同名产生冲突导致clean没法执行,因为make clean每次都会执行它没有依赖 也不生成clean文件每次都有跟新,但当有clean文件生成是由于没有依赖clean永远都是最新的不会执行clean命令,加上.PHONY 后表示忽略clean文件存在与否都会执行。
8. 如何判断makefile中那些是shell命令呢
其实每个target下的命令都是shell命令,make是依托于shell命令解释器的。下面关makefile中shell命令的应用我们做个详解:
var = 3
target: test1 test2
echo $(var) ;\ step1
var=4;\ step2
echo $(var) ;\ step3