• 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

  • 相关阅读:
    Oracle:DBMS_STATS.GATHER_TABLE_STATS的语法
    Oracle Purge和drop的区别
    Oracle Pipelined Table Functions简介
    Firefox与IE浏览器缓存的两个重要区别
    @SuppressWarnings的使用、作用、用法
    正确优雅地解决用户退出——JSP及Struts解决方案
    log4j详解与实战
    maven项目在eclipse中debug时看不到源码?
    maven tomcat eclipse 配置 debug
    Java泛型详解
  • 原文地址:https://www.cnblogs.com/mydomain/p/2136083.html
Copyright © 2020-2023  润新知