zoukankan      html  css  js  c++  java
  • 21、makefile常用语法讲解(1)

    1、make是一个解释makefile中指令的命令工具。Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。

    Makefile 里主要包含了五种类型的语句/行:显式规则、隐式规则、变量定义、文件指示和注释。

    make命令格式:make [-f Makefile] [option] [target] 

    2、编译和链接规则

    1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

    2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。

    3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

    3、makefile的构成

    1)需要由make工具创建的目标体(target),通常是目标文件或可执行文件

    2)要创建的目标体所依赖的文件(dependency_file)。

    3)创建每个目标体时需要运行的命令(command)。

    格式如下:

    target:dependency_files

    <TAB>command

    在这里面,变量一般都是字符串,他有点像c语言的宏。

    makefile中的文件指示,包含3部分,一个是在一个Makefie中引用另一个Makefile,就像c语言的include一样;另一个是根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。

    注释:注释符用"#",可以用反斜框进行转义,如输入注释,“\#”。

    4、makefile的书写

    1)所有文件都在一个目录中

    示例

    st_work : main.o  st_work.o  fun.o

    gcc  main.o  st_work.o  fun.o  -o  st_work main (命令以Tab开头)

    st_work.o : st_work.c

    gcc  -c st_work.c  -o st_work

    main.o : main.c  st_work.h

    gcc -c main.c -o  main.o

    fun.o : fun.c fun.h

    gcc -c  fun.c -o fun.o

    clean:

    rm -f st_work *.o

    2)多目录的写法

    我们这里,在工作目录下有4个文件夹  分别是 sources(源文件) obj (中间文件)headers(头文件) bin(目标文件)

    sources里面有 main.c  st_work.c fun.c

    obj 里面最初没有文件

    headers 里面有 fun.h st_work.h

    最终目标取名为 st_work,它应存放到bin里面

    预备知识:

    gcc 的3个参数:

    1. -o 指定目标文件

    gcc sources/main.c -o bin/main

    2. -c 编译的时候只生产目标文件不链接

    gcc -c sources/main.c -o obj/main.o

    3. -I 主要指定头文件的搜索路径

    gcc -I headers -c main.c -o main.o

    4. -l 指定静态库

    gcc -lpthread ...

    示例

    bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o  

       gcc  obj/main.o obj/st_work.o  obj/fun.o  -o bin/st_work  (命令以Tab开头)

    obj/st_work.o : sources/st_work.c

    gcc  -I  headers -c sources/st_work.c  -o  obj/st_work.o

    obj/main.o : sources/main.c

    gcc  -I  headers -c sources/main.c    -o  obj/main.o

    obj/fun.o  : sources/fun.c

    gcc  -I  headers -c sources/fun.c     -o  obj/fun.o

    clean:

    rm -f bin/st_work obj/*.o

    3)隐式规则的引入

        3个预定义变量介绍:

    1.  $@     表示要生成的目标

    2.  $^     表示全部的依赖文件

    3.  $<     表示第一个依赖文件

    bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o  

    gcc  $^  -o $@  (命令一定要用以Tab开头)

    obj/st_work.o : sources/st_work.c

    gcc  -I  headers   -c $< -o  $@

    obj/main.o : sources/main.c

    gcc  -I  headers   -c $< -o  $@

    obj/fun.o  : sources/fun.c

    gcc  -I  headers   -c $< -o  $@

    clean:

    rm -f bin/st_work obj/*.o

  • 相关阅读:
    day 66 crm(3) 自创组件stark界面展示数据
    day 65 crm(2) admin源码解析,以及简单的仿造admin组件
    用 Python+nginx+django 打造在线家庭影院
    django -admin 源码解析
    day 64 crm项目(1) admin组件的初识别以及应用
    云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
    day 56 linux的安装python3 ,虚拟环境,mysql ,redis
    day55 linux 基础以及系统优化
    Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
    Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
  • 原文地址:https://www.cnblogs.com/mydomain/p/2136083.html
Copyright © 2011-2022 走看看