Make File
Lesson1: makefile 学习
_1 makefile作用: 来源于网络
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
案例规则:网络
我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
Makefile:主要的作用 编译和安装我们的程序
Makefile 的编写规程:就是一条 一条的规则
格式:规则1 目标:依赖
命令
规则2
规则3 。。。。。
Demo:
Hello: main.c fun1.c fun2.c
gcc main.c fun1.c fun2.c –o Hello
执行make
Dem2:编写一个makefile
Vi makefile
# creat first rule //#注释
Hello:main.c func1.c func2.c
Gcc main.c func1.c func2.c –o Hello
执行make 生成 makefile文件
Demo2
# creat first rule //#注释
Hello:main.o func1.o func2.o
gcc main.o func1.o func2.o –o Hello
Main.o: main.c
Gcc -c main.c
func1.o: func1.c
Gcc -c func1.c
func2.o: func2.c
Gcc -c func2.c
小节:根据时间戳的 他不会去在加载以前加载过的 修改后会重新编 要想从新编译使用 make clean
思考 make clean 是如何写的
例如:在makefile中
Clean:
rm main.o func1.o func2.o
执行make clean
特点 :像 目标 没有 依赖的 叫做 伪命令
二makefile中的变量
_1用户自定义变量:
Demo:
Hello: fun1.o fun2.o fun3.o
Gcc fun1.o fun2.o fun3.o -o Hello
使用自定义变量替换
MyObj = fun1.o fun2.o fun3.o
Hello:$(MyObj )
Gcc $(MyObj ) -o Hello
声明了 自动变量 MyObj 通过 $( ) 方式使用自定义变量
_1预定义变量:
AR:库文件维护的程序名称 默认值为ar
AS:汇编程序的名称 默认值为as
CC: C编译器的名称 默认为CC
CXX:C++编译器的名称 默认值为G++
ARFLAGS: 库文件维护程序选项 无默认值
ASFLAGS: 汇编程序选项 无默认值
CFLAGS: C 编译器选项 无默认值
CXXFLAGS: C++ 编译器选项我默认值
作用:全局的常量
Demo
Cc= gcc
$(cc) hello.c -o hello
好处;如果更换了 编译类项 可以更改一个 就换了所以
_3自定义变量及环境变量:
$*: 不包含扩展名的目标文件名称
$<:第一个依赖文件的名称
$?:所有时间戳比目标文件 晚的依赖文件
$@: 目标文件的完整名称 -------------- 常用
S^:所有不重复的依赖文件---------------
Demo:
Gcc $^ -o $@
$^:= mian.o fun.o fun2.o 获取所有不重复的依赖文件
$@ =hello 生产目标文件的 完整名称
特点: 不会在建立文件 并且会执行命令
Install:
Cp hello/usr/local/hello
Uninstall:
Rm /usr/local/hello
Lesson2: 变量
_1: 用户自定义变量
Hello:main.o fun1.o fun2.o
Gcc main.o fun1.o fun2.o -o Hello
使用自定义变量替换
_2:预定义变量
_3:自动变量和环境变量