• make和makefile基础使用


    2019-10-16 爱虫子

    1. Make和Makefile 简介

    make是一款工程管理器,同时也可以视为是一个命令,而Makefile就是该命令的操作对象。当使用make命令时,默认操作当前路径下的Makefile文件,并基于Makefile文件中的内容进行对工程文件的编译、管理等工作。

    1.1make和Makefile的意义:

    1)减少编译的工作量,节约编译时间

    2)简化编译操作

     2.Make和Makefile 的简单应用示例

     2.1Makefile 语法格式

    target ... : prerequisites ...
        command
        ...

    target: dependency_files          //目标项:依赖项   目标名随便定义

    TAB键 command               //必须以tab键开头,command编译命令

    注意:在写command命令行的时候,必须要在前面按TAB键

    解释:

    目标项:一般填写需要生成文件,比如工程最终可执行文件、库文件、目标文件等。也可以填写其他任意的名称(伪目标)

    依赖项:一般填写生成目标项所依赖的文件

    command:一般填写如何通过依赖项生成目标项(可以是多条语句)

    当使用make 目标  命令时,则会根据make原则,可能会执行相应的command的内容

     

     2.2Make命令用法

    基本用法:make           //直接使用make,相当于make第一个目标
           或make 目标 

    2.3 Makefile编译c程序示例

    qing@qing:~/daima/make$ make
    gcc -c main.c -o main.o
    gcc -c hello.c -o hello.o
    gcc main.o hello.o -o main
    qing@qing:~/daima/make$cat Makefile 
    main: main.o hello.o
        gcc main.o hello.o -o main
        
    main.o: main.c hello.h
        gcc -c main.c -o main.o
    
    hello.o: hello.c
        gcc -c hello.c -o hello.o

    3.Makefile的变量

    Makefile中变量分类:用户自定义变量,预定义变量,自动变量,环境变量

    3.1用户自定义变量

    变量名:=变量值 简单变量展开(类似于C语言赋值) ,是覆盖之前的值, 通常采用这种形式

    A := abc

    A := $(A)d 

    3.2预定义变量

    预定义变量:内部事先定义好的变量,但是它的值是固定的,并且有些的值是为空的。

    AR:库文件打包程序默认为ar

    AS:汇编程序,默认为as

    CC:c编译器默认为cc

    CPP:c预编译器,默认为$(CC) -E

    CXX:c++编译器,默认为g++

    RM:删除,默认为rm -f

    ARFLAGS:库选项,无默认

    ASFLAGS:汇编选项,无默认

    CFLAGS:c编译器选项,无默认

    CPPFLAGS:c预编译器选项,无默认

    CXXFLAGS:c++编译器选项

    3.3自动变量

    自动变量:指在使用的时候,自动用特定的值替换。

    变量

    说明

    $@

    当前规则的目标文件

    $<

    当前规则的第一个依赖文件

    $^

    当前规则的所有依赖文件,以逗号分隔

    $?

    规则中日期新于目标文件的所有相关文件列表,逗号分隔

    $(@D)

    目标文件的目录名部分

    $(@F)

    目标文件的文件名部分

     

     

     

     

     

     

     

    4. shell函数优化Makefile

    示例:改进后的Makefile

    工程中所有文件放在同一路径下。

    qing@qing:~/daima/make$cat Makefile
    EXE := main
    SRCS := $(wildcard *.c)
    OBJS := $(SRCS:%.c=%.o)
    CFLAGS := -Wall -O2 -fpic @# -Wall(输出警告)-O2 (优化的选项) -fpic(节约内存)
    
    
    $(EXE): $(OBJS)
        $(CC) $^ -o $@
    
    %.o: %.c
        $(CC) $(CFLAGS) -c $< -o $@
    
    .PHONY: clean rebuild
    clean:
        @$(RM)  $(OBJS)
    
    rebuild:
        @make clean
        @make $(EXE)

    总结:

    确定Makefile的大致框架,熟悉Makefile常用函数、规则的用法。

    之后编写多文件工程时,将整个工程文件封装到成一个文件夹,将Makefile加入,使用Makefile进行编译工程

    5. Makefile 中的函数

    常用几个shell函数有 wildcard,patsubst,addprefix

    6. Makefile中一些GNU约定俗成的伪目标

    伪目标

    含义

    all 所有目标的目标,其功能一般是编译所有的目标
    clean 删除所有被make创建的文件
    install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
    print 列出改变过的源文件
    tar 把源程序打包备份. 也就是一个tar文件
    dist 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件
    TAGS 更新所有的目标, 以备完整地重编译使用
    check 或 test 一般用来测试makefile的流程
  • 相关阅读:
    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
    Java生鲜电商平台-电商会员体系系统的架构设计与源码解析
    Java生鲜电商平台-优惠券系统的架构设计与源码解析
    Java生鲜电商平台-促销系统的架构设计与源码解析
    Java生鲜电商平台-电商支付流程架构实战
    Java生鲜电商平台-商城后台架构与原型图实战
    还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
    后端程序员就靠它吃饭了,推荐一份夯实基础的操作系统书单!
    学习计算机基础必读的4本经典入门书籍,自学编程必备书单!
    这份Java Web必读书单,值得所有Java工程师一看!
  • 原文地址:https://www.cnblogs.com/zhouyuqing1024/p/11688455.html
Copyright © 2020-2023  润新知