用Make进行宏编译
为什么用makefile?
当一个程序分为多个部分的时候,当其中的一个文件修改后需要重新编译所有的文件,过程非常复杂。
在makefile中,存在系统默认的自动化变量
:代表所有的依赖文件
@:代表目标
$<:代表第一个依赖文件
Demo如下:
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
# gcc $^ -o $@ ${LIBS}
gcc -o $@ $^ ${LIBS}
clean:
rm -f ${OBJS}
Linux makefile
make就像Shell脚本一样,其中也可以执行操作系统的命令。整个软件工程的编译、链接只需要一个make指令就可以完成。其中包括:哪些源文件需要编译以及如何编译;需要创建哪些库文件以及如何创建这些库文件、如何产生我们想要的可执行文件。
规则:用于说明如何生成一个或多个目标文件,规则格式如下:
targets:prerequisites
command
目标 依赖 命令
main.o(目标):main.c(依赖)
gcc -c main.c(命令)
makefile中把那些没有任何依赖只执行动作的目标成为“伪目标”(phony targets)
http://blog.csdn.net/ruglcc/article/details/7814546/
可以参考鸟哥的Linux私房菜 第668页
makefile的基本语法与变量
makefile规则如下:
目标(target):目标文件1 目标文件2
gcc -o 欲新建的可执行文件 目标文件1 目标文件2
Demo1
makefile文件里面有两个目标:
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
只编译:
make main
清除信息:
make clean
先清除信息再编译:
make clean main
Demo2
运用变量来简化makefile:
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
注:
1.变量与变量内容以“=”隔开,同时两边具有空格。
2.变量左边不可以有,例如上面范例的第一行LIBS左边不可以有
3.变量习惯上用大写。
Demo3
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall #这个变量加入一些标识信息
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
Demo4
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall #这个变量加入一些标识信息
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS} #$@ 就是main
clean:
rm -f main ${OBJS}
Demo5
makefile当中ifeq和else ifeq的使用
#VAR1 = A
VAR1 = B
main: main.o
gcc -o main main.o
ifeq ($(VAR1),A)
./toucha.sh
else ifeq ($(VAR1),B)
./touchb.sh
endif
clean:
rm -f main main.o a.txt b.txt
Demo5
当同时想编译两个输出的可执行文件时,要加入all,Demo如下;
all: main1 main2
main1: main1.o
gcc -o main1 main1.o
main2: main2.o
gcc -o main2 main2.o
clean:
rm -f main1 main1.o main2 main2.o
makefile里面有什么?
Makefile里主要包含了五个东西:显示规则、隐晦规则、变量定义、文件指示和注释。
显示规则:显示规则说明了如何生成一个或多个的目标文件。
隐晦规则:由我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗略书写makefile。
变量定义:
文件指示:
注释:
文件名
make -f 文件名
变量
在makefile中,存在系统默认的自动化变量。
:代表所有的依赖文件
@:当前目标的名字
<:当前依赖文件的名字c
<script type="math/tex" id="MathJax-Element-9">< : 当前依赖文件的名字c </script>*:不包括后缀名的当前依赖文件的名字
在makefile文件中,下面两个字符也经常会遇见:
@:告诉make在执行某条命令前不要将该命令显示在标准输出上。
-:告诉make命令忽略所有错误。
内置规则
make命令本身带有大量的内置规则,可以极大地简化makefile文件的内容。
make main1.c
也可以指明是通过gcc
make CC=gcc CFLGAS=”-Wall -g” main1.c