【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践

这篇具有很好参考价值的文章主要介绍了【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、makedile的概述

1、案例引入

2、makefile 

3、Makefile优点

二、makefile的语法规则 

1、语法规则

2、简单实战

三、makefile的变量

1、自定义变量

2、系统环境变量

3、预定义变量

4、高级makefile


一、makefile的概述

1、案例引入

gcc a.c b.c c.c ‐o main

如果只修改了b.c 使用gcc编译 需要对所有文件重新编译。makefile可避免此问题.

2、makefile 

make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令。

makefile 是个文件,这个文件中描述了程序的编译规则

3、Makefile优点

        (1)简化编译程序的时候输入得命令,编译的时候只需要敲 make 命令就可以了

        (2)可以节省第二次编译时间,提高编译效率

二、makefile的语法规则 

1、语法规则

目标文件名:依赖文件(建立关系)

<Tab>命令列表

目标文件:就是需要生成的文件(可执行文件、其他obj文件或动作名称)

依赖文件:通过依赖文件 生成 目标文件(通常有几个依赖文件)

命令列表:实现 将依赖文件 生成 目标文件(多个命令时,每个命令占一行)

以gcc a.c b.c c.c -o main编译三个文件为例:

语法实例:

main:a.c b.c c.c

        gcc a.c b.c c.c ‐o main

2、简单实战

(1)创建并编写test.c文件

#include <stdio.h>
int main(int argc, char const *argv[])
{
    printf("hello world\n");
    return 0;
}

(2)创建并编写makefile文件

main:test.c
    gcc test.c ‐o main

(3)最后在linux终端输入命令make即可编译test.c文件

make 默认在工作目录中寻找名为 GNUmakefile、makefile、Makefile 的文件作为输入文件

make -f 自定义makefle文件名自定义文件名的文件作为输入文件

make 默认会实现 makefile 文件内的第一个目标make 目标文件名 ----->选择目标执行

多个目标时,命令make 目标文件名:另一目标文件名 ----->选择多个目标执行

3、较复杂实战

(1)创建并编写fun.c

int my_add(int x, int y)
{
    return x+y;
}
int my_sub(int x, int y)
{
    return x-y;
}
int my_mul(int x, int y)
{
    return x*y;
}
int my_div(int x, int y)
{
    return x/y;
}

(2)创建并编写fun.h

#ifndef __FUN_H__
#define __FUN_H__

extern int my_add(int x, int y);
extern int my_sub(int x, int y);
extern int my_mul(int x, int y);
extern int my_div(int x, int y);

#endif

(2)创建并编写main.c

#include <stdio.h>
#include "fun.h"
int main(int argc, char const *argv[])
{
    printf("%d\n", my_add(10, 20));
    printf("%d\n", my_sub(10, 20));
    printf("%d\n", my_mul(10, 20));
    printf("%d\n", my_div(10, 20));

    return 0;
}

(3)创建并编写makefile

main:main.o fun.o
    gcc main.o fun.o -o main
main.o:main.c
    gcc -c main.c -o main.o
fun.o:fun.c
    gcc -c fun.c -o fun.o
clean:
    rm *.o main

程序流程:当要执行第一个目标时没有找到main.o和fun.o,会往下寻找生成main.o和fun.o的指令,执行完生成main.o和fun.o的指令后才返回执行第一个指令。

问题:.o过多时相应的指令变多,可以利用makefile的变量优化

三、makefile的变量

1、自定义变量

makefile变量类似于C语言中的,变量名可以数字开头大小写敏感,一般在头部定义

变量名=变量值

取变量值:$(变量名)${变量s

以二中较复杂实战为例做自定义修改:

//自定义变量
cc=gcc
exec=main
obj=main.o fun.o

//用自定义变量做部分修改
$(exec):$(obj)
$(cc) $(obj) ‐o $(exec)
main.o:main.c
$(cc) ‐c main.c ‐o main.o
fun.o:fun.c
$(cc) ‐c fun.c ‐o fun.o
clean:
rm *.o $(exec)

2、系统环境变量

make工具解析makefile前,读取系统环境变量并设置为makefile的变量。

linux下查看环境变量命令:env

linux下添加系统环境变量命令:export 要添加的变量名=变量值,举例:export cc=gcc.

3、预定义变量

【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践,C/C++,c语言,开发语言

4、高级makefile

以优化二中较复杂实战为例:文章来源地址https://www.toymoban.com/news/detail-615171.html

//自定义变量
cc=gcc
exec=main
obj=main.o fun.o
flags=‐Wall
//用自定义变量和预定义变量修改优化
$(exec):$(obj)
    $(cc) $^ ‐o $@ $(flags)
%.o:%.c//此时只需一条语句即可完成多条编译语句
    $(cc) ‐c $< ‐o $@ $(flags)

clean:
    rm $(obj) $(exec)

到了这里,关于【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C/C++|物联网开发入门+项目实战|函数输入与输出|值传递|地址传递|连续空间的传递|嵌入式C语言高级|C语言函数的使用-学习笔记(11)

    参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 一堆代码的集合,用一个标签去描述它 复用化,降低冗余度 标签 ------ 函数名 函数和数组都属于内存空间,函数具备3要素: int *p; int a[100]; 1、函数名(地址) 2、输入参数 3、返回值 在定义函数时,必须将3要素告知编译器

    2023年04月20日
    浏览(55)
  • 【嵌入式——C语言】共用体

    定义 :共用体和结构体类似,也是一种构造类型的数据结构,在进行某些算法时,需要使用几种不同类型的变量存到同一段内存单元中,几个变量所使用空间相互重叠,这几个不同的变量共同占用一段内存的结构,被称作共用体类型结构。 共用体的大小是其占内存长度最大

    2024年01月22日
    浏览(47)
  • 嵌入式 QT 界面布局管理

    目录 1、实例程序功能 2、界面组件布局 2.1 界面组件的层次关系 2.2 布局管理 2.3 伙伴关系和Tab顺序       创建一个 Widget Application 项目 samp2_2, 在创建窗体时选择基类 QDialog ,生成的类命名为 QWDialog ,并选择生成窗体。     如 此 新建 的项 目 samp2_2 有一 个界 面文 件 qwdi

    2024年02月04日
    浏览(56)
  • 嵌入式C语言(入门必看)

          目录 STM32的数据类型 const static volatile extern  struct结构体 enum  typedef #define 回调函数 #ifdef 、#ifndef、#else  、#if     嵌入式开发中既有底层硬件的开发又涉及上层应用的开发,即涉及系统的硬件和软件,C语言既具有汇编语言操作底层的优势,又

    2024年01月17日
    浏览(44)
  • 【面试集锦 - 嵌入式软件 - C语言】

    指针函数(Pointer to a Function)和函数指针(Function Pointer)是在C和C++中经常使用的概念,它们虽然名称相似,但是在用法和作用上有一些区别。 指针函数 指针函数是指返回值为指针类型的函数。换句话说,它是一个函数,其返回类型是一个指针。指针函数可以用来实现动态分

    2024年02月07日
    浏览(53)
  • (嵌入式c语言)c语言编译常见错误

    预处理(gcc -E -o)-编译(gcc -S -o)-汇编(gcc -c -o)-链接(gcc -o) 将代码中的define 和 include替换成实体码  define和include不是,是在编译过程中处理的。 包含 #include 包含头文件 宏 #define 宏  替换  不会进行语法检查 #define 宏  宏体   宏体要加括号 #define ABC 

    2024年02月11日
    浏览(41)
  • 嵌入式项目分享 stm32智能运动计步系统 - 物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(76)
  • 【嵌入式项目应用】__用于搭建调试输出、建立时间系统的嵌入式框架“Zorb Framework”

    目录 一、什么是Zorb? 二、嵌入式环境搭建 三、调试输出 四、实现断言 五、建立时间系统 六、结束语 (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 Zorb Framework是一个基于 面向对象 的思想来搭建一个 轻量级的嵌入式框架 。 搭建Zorb Framework的目的是为在不能运行

    2024年02月06日
    浏览(49)
  • Linux嵌入式项目-智能家居

    一、资料下载  二、框架知识  三、MQTT通信协议 1、上位机APP主要工作        1.wait for msg  / while(1)订阅等待消息        2.处理消息 客户端创建了两个线程,一个线程用于发布消息,一个线程用于监听订阅消息 (那我的仿真系统也可以啊,一个发送处理数据线程。一个监听

    2024年02月16日
    浏览(50)
  • 嵌入式项目分享 stm32机器视觉的口罩佩戴检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(152)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包