首页 > 其他分享 >makefile 编写规则

makefile 编写规则

时间:2023-04-01 13:34:07浏览次数:26  
标签:OBJ utils makefile actor player 规则 test 编写 main

(一)makefile 规则

 一般开头都是 Tab ,不能空格, include 前面不能是 Tab;

  1、如果没编译过,将所有的  (.c) 文件编译并且链接;

  2、如果有其中的 (.c) 文件改变,编译并链接改变的文件;

  3、如果(.h)文件被修改,编译引用相应的 (.c) 文件, 链接;

  4、在随意修改时间的情况下,会导致编译过程中生成的 (.o 中间文件)与可执行文件时间不一致,此时会编译相应的文件,并链接,最终编译成可执行文件;

(二)例子

例如有2个  .h 文件(utils.h,  player.h, actor.h)和 3个 .c 文件( main.c, player.c, actor.c)需要编译链接:

/*****main.c*********/
#include "utils.h"
#include "player.h"

void main() {
 // do something
}
/*******player.c**********/

#include "utils.h"
#include "actor.h"

bool create_player() {
// do something
}
/****actor.c************/

#include "utils.h"

bool create_actor() {
// do something
}

1.第一版 makefile

/*********  makefile   *****************/    
    test : main.o actor.o
        cc -o test main.o actor.o

    main.o : main.c utils.h player.h actor.h
        cc -c main.c

    palyer.o: player.c player.h actor.h utils.h
        cc -c player.c

    actor.o: actor.h utils.h
        cc -c actor.c

    clean:
        rm test ain.o player.o actor.o

  优点:可毒性很强,思路清晰 明了;

  缺点:麻烦,重复的依赖过多,当需要编译大量文件时容易出错;

2.第二版:利用 makefile 的变量

/*********  makefile   *****************/    
    OBJ = main.o actor.o    // 跟第一版比较,唯一的区别在这

    test : $(OBJ)        // 这儿
        cc -o test $(OBJ)      // 这儿

    main.o : main.c utils.h player.h actor.h
        cc -c main.c

    palyer.o: player.c player.h actor.h utils.h
        cc -c player.c

    actor.o: actor.h utils.h
        cc -c actor.c
   .PHONY : clean    // 伪目标,避免:如果当前目录下存在 clean rm 指令不执行
    clean:
        -rm test $(OBJ)   // 前面的 (-) 表示,执行过程中不 care 出错;

3.第三版:利用 GUN make 的自动推导规则

当 make 看到 (.o )文件,他会自动把 (.c) 文件加上依赖关系,包括执行的语句(cc -c xx.c);

/*********  makefile   *****************/    
    OBJ = main.o actor.o    // 跟第一版比较,唯一的区别在这

    test : $(OBJ)        // 这儿
        cc -o test $(OBJ)      // 这儿

    main.o : utils.h player.h actor.h

    palyer.o: player.h actor.h utils.h

    actor.o: actor.h utils.h

   .PHONY : clean    // 伪目标,避免:如果当前目录下存在 clean rm 指令不执行
    clean:
        -rm test $(OBJ)

4.第四版: 对第三版的整理(有一些重复的  .h)

/*********  makefile   *****************/    
    OBJ = main.o actor.o    // 跟第一版比较,唯一的区别在这

    test : $(OBJ)        // 这儿
        cc -o test $(OBJ)      // 这儿

    $(OBJ) : utils.h actor.o
    main.o player.o

   .PHONY : clean    // 伪目标,避免:如果当前目录下存在 clean rm 指令不执行
    clean:
        -rm test $(OBJ)

 优点:简洁   缺点:不好理解 

5.大型项目makefile编写

Makefile 同样也有像 c / c++ 类似的include功能;

例如我们有一堆 a.mk , b.mk以及 foo.make和一个变量 $(bar),其包含了 e.mk,f.mk, 那么 

 include foo.make *.mk $(bar)   >———  等价——> include foo.make a.mk b.mk e.mk f.mk

标签:OBJ,utils,makefile,actor,player,规则,test,编写,main
From: https://www.cnblogs.com/imreW/p/17278475.html

相关文章

  • DSL5.变量定义区的权限规则
    当事人如果当事人被初始化,将定义一个初始化函数实现当事人的赋值,合约部署者可以对当事人参数进行修改如果当事人被is定义,该当事人将无法修改资产如果资产被当事人拥有,该资产如果被初始化,仅当事人可以修改该资产如果资产未被当事人拥有,该资产处于未定义状态,合约部署者......
  • DSL5.变量定义区的权限规则
    当事人如果当事人被初始化,将定义一个初始化函数实现当事人的赋值,合约部署者可以对当事人参数进行修改如果当事人被is定义,该当事人将无法修改资产如果资产被当事人拥有,该资产如果被初始化,仅当事人可以修改该资产如果资产未被当事人拥有,该资产处于未定义状态,合约部署者......
  • c++socket编程之客户端编写
    开头用WINAPI完成了socket客户端的编写cursor很适合用于写这种单文件的WINAPI代码编写,写的很规范,它帮助我完成了API的调用,参数的选择和异常值处理,自己去写还挺费时间但不得不吐槽下,我提的几个处理中文和处理多任务的需求,无论我换何种说法,它实现的都不太好,甚至还有错误功......
  • c++ socket编程之服务端编写
    开头想要写一个带界面、功能全面、传输高效、运行稳定的马儿,能够在生产环境下工作在cursor的帮助下,用一天时间完成了服务端和客户端的编写另外一天时间卡在了中文消息传输处理和大文件传输粘包、分包问题上功能收发消息,支持中文消息发送命令执行并显示命令执行结果任意......
  • day3 函数的定义和调用,练习编写简单的程序(记录3)
    0331.h#ifndef_0331_H#define_0331_H/********************************************************************文件名称:0331.h*功能描述:函数的定义和调用的头文件*创建作者:wenjie*创建日期:2023/03/31*************************************************************......
  • day3 函数的定义和调用,练习编写简单的程序(记录1)
    一、函数的定义可以分为以下两种:1、函数声明和函数定义分离这种方法将函数声明和函数定义分开,通常在头文件中先声明函数原型,然后在源文件中实现函数定义。例如,头文件example.h中声明了一个函数add:#ifndefEXAMPLE_H#defineEXAMPLE_Hintadd(inta,intb);//声明函......
  • Excel批量检查5列数值是否相等(存在不规则空值)
    因存在位置未知的空值,需要两两空值判断再进行比较,所以5列两两相比有10种可能,需要全面考虑,缺一都可能导致数据不准确(空值位置影响)案例中当前单元格的函数:=AND(IF(OR(B3="",C3=""),TRUE,B3=C3),IF(OR(C3="",D3=""),TRUE,C3=D3),IF(OR(D3="",E3=""),TRUE,D3=E3),IF(OR(E3="&q......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能编写Python注释文档字符串从0到1快速入门
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 三菱FX3U,用ST语言与梯形图,混合编写的16仓位的配方程序,程序大小约12984步
    三菱FX3U,用ST语言与梯形图,混合编写的16仓位的配方程序,程序大小约12984步,可以配1到16种不同的产品,16种配方可以根据自己的需求随意设置配方数量与产品数量,可以用条形码设置配方数据与生产数量,也可以使用触摸屏手动设置,共使用了两台秤同时工作,一台秤配8个仓位的配料,使用FX3U485ADP走......
  • 低代码开发重要工具:jvs-rules 规则引擎,让业务调整更智能
    JVS-rules规则引擎由JVS逻辑引擎结合金融、咨询管理等多种行业特点而实现的业务配置器,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定......