Makefile学习

来源:互联网 发布:美萍足浴 sql版 编辑:程序博客网 时间:2024/05/16 05:05

Make File

Lesson1: makefile 学习

_1 makefile作用: 来源于网络

makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率

案例规则:网络

我们的工程有8C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
    1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
    2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
    3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

Makefile:主要的作用 编译和安装我们的程序

Makefile 的编写规程:就是一条 一条的规则

格式:规则目标:依赖

命令

  规则2

  规则。。。。。

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:自动变量和环境变量