注:本文参照博客:https://blog.csdn.net/initphp/article/details/7692923

1. 概述
2. 示例说明
2.1 无makefile编译
2.2 有makefile编译
3.Makefile详解
3.1 Makefile的文件名称
3.2 目标可执行文件
3.3 中间目标文件
3.4 生成目标文件的命令
3.5 换行符\
3.6 clean清除操作
4. 执行流程
5. 变量使用
6. make的自动推导功能
7. include引用其他文件

1. 概述

Makefile是一个C语言的程序编译规则。它能够帮助C语言建立自动化编译流程。一旦写好,便可以通过执行make命令,来编译整个工程。

2. 示例说明

创建项目如下:
val.h和val.c
val.h

    #include<stdio.h>#include<stdlib.h>#include<unistd.h>int val(int *x);

val.c

    #include "val.h"int val(int *x) {puts("This is value=");printf("x:%d\n",*x);return 0;}

get.h和get.c
get.h

    #include<stdio.h>#include<stdlib.h>#include<unistd.h>int get(int *x,int *y);

get.c

    #include "get.h"int get(int *x,int *y) {puts("This is get");return(*x)*(*y);}

sum.h和sum.c
sum.h

    #include<stdio.h>#include<stdlib.h>#include<unistd.h>int sum(int *x,int *y);

sum.c

    #include "sum.h"#include "val.h"int sum(int *x,int *y){val(x);puts("This is sum method");return *x + *y;}

main.c

    #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include "sum.h"#include "get.h"int main(){int x = 10;int y = 20;int z = sum(&x,&y);puts("This is Main");printf("z:%d\n",z);x = 20;z = get(&x,&y);printf("z:%d\n",z);return 1;
}

2.1 无makefile编译

生成中间目标文件
执行:gcc -c val.c get.c sum.c main.c
生成可执行文件
执行:gcc -o main main.o val.o sum.o get.o

2.2 有makefile编译

编辑makefile文件
注意:命令行需要[tab]键的空格

    main: get.o sum.o val.o main.ogcc -o main get.o sum.o val.o main.omain.o:main.cgcc -c main.cval.o:val.h val.cgcc -c val.csum.o:val.h sum.h sum.cgcc -c sum.cget.o:get.h get.cgcc -c get.cclean:rm -rf *.o

执行make命令

3.Makefile详解

3.1 Makefile的文件名称

makefile或者Makefile,一般采用大写(大写比较引人注目)。
当执行make命令时,工具会从当前目录寻找makefile文件。

3.2 目标可执行文件

main:get.o sum.o val.o main.o,main为目标可执行文件,也就是编译最后成功的文件名称。冒号后面的就是整个可执行文件依赖的中间目标文件。

3.3 中间目标文件

以.o结尾的就是中间目标文件。冒号后面跟的是目标文件的依赖文件:.h和.c文件

3.4 生成目标文件的命令

gcc命令代表将中间的目标文件连接起来,最终生成目标可执行文件。需要主要的是,命令行都是在第二行,且以tab键的空格,否则会不生效。

3.5 换行符\

如果一行太长,可以通过符号\来进行换行。

3.6 clean清除操作

clean是动作命令。make clean会清除的目标中间文件.o

4. 执行流程

  1. 当用户敲下make命令时,make工具会去找当前C工程目录下的Makefile或者makefile文件
  2. 找到Makefile这个文件后,它会找到第一个目标文件。然后去当前C工程目录下是否有main这个可执行的文件。然后判断这个可执行文件是否是最新的,如果是最新的,则不需要编译
  3. 如果不存在main这个可执行文件,make命令就会去生成.o中间目标文件,然后生成main可执行文件
  4. 如果main存在,make回去比较中间文件.o文件是否更新,如果是最新的则不需要更新,不是最新的继续往下找依赖,找到有需要更新的目标文件的时候,就会执行编译命令
  5. 整个make的依赖性就是make会一层层去找依赖关系,并且比较是否需要更新,直到编译出最终的可执行目标文件

5. 变量使用

Make file中也可以使用变量。变量可以用或者object或者(object)这样的方式使用。
使用变量最大的好处就是大大简化了Makefile编写难度,增强了Makefile文件的可维护性

    object = get.o sum.o val.o main.omain:${object}gcc -o main${object}main.o:main.cgcc -c main.cval.o:val.h val.cgcc -c val.csum.o:val.h sum.h sum.cgcc -c sum.cget.o:get.h get.cgcc -c get.cclean:rm -rf *.o

6. make的自动推导功能

object = get.o sum.o val.o main.o
main:${object}gcc -o main${object}
main.o:get.h sum.h
val.o:val.h
sum.o:val.h sum.h
get.o:get.h
clean:rm -rf *.o

7. include引用其他文件

转载于:https://www.cnblogs.com/liwanliangblog/p/9265330.html

Linux-C-Program:makefile相关推荐

  1. Linux 内核顶层Makefile 详解

    目录 前602行分析 make xxx_defconfig 过程 Makefile.build 脚本分析 make 过程 built-in.o 文件编译生成过程 make zImage 过程 前几章我 ...

  2. Linux学习笔记-Makefile的基本使用

    程序自动编译: 在vc中,点击"生成解决方案"就能生成解决方案: 在linux中使用Makefile,是一个脚本文件,和vc中生成解决方案差不多. 写如下代码: other.h v ...

  3. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  4. linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解

    Sam需要看看2.6 kernel中USB Mouse的代码.顺便谈谈Kernel中Makefile和Kconfig文件的关系以及配合使用. 背景知识: 背景知识一:Kconfig介绍: 在#make ...

  5. spdlog linux编译出错,Linux下编写Makefile引入第三方库

    Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...

  6. Linux C编程Makefile编写初步-转

    Linux C编程Makefile编写初步 假设我们有下面这样的一个程序,源代码如下:  /* main.c */  #include "mytool1.h"  #include  ...

  7. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. linux内核顶层Makefile详解

    文章目录 一.linux内核获取 二.linux内核初次编译 三.linux工程目录分析 1.获取源码 2.目录介绍 1.总体浏览 2.arch 目录 3.block 目录 4.crypto 目录 5 ...

  9. Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)

    Linux下的makefile编写 前言 本人记笔记习惯使用OneNote,在学习LinuxC++过程中发现deepin上没有大佬开发或者移植,本人技术也不精,所以决定写博客记笔记(只是习惯问题,并没 ...

  10. Linux 内核顶层 Makefile 详解

    Linux 内核获取 Linux 由 Linux 基金会管理与发布, Linux 官网为 https://www.kernel.org,所以你想获取最新的 Linux 版本就可以在这个网站上下载 最新 ...

最新文章

  1. 学会放下包袱,热爱单例
  2. Scala基础:定义变量和逻辑判断语句以及方法和函数
  3. C# ASPX页面做上传提示:超过了最大请求长度,解决方法
  4. dom4j解析xml_JAVADom、Sax解析XML详解
  5. php 判断 小米 手机浏览器,网信办宣布整治手机浏览器 华为、QQ、小米等先查
  6. gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master
  7. Zabbix3.4监控Linux主机CPU温度
  8. 电脑蓝牙突然无法使用,解决办法来了
  9. 英语基础语法 (十三) it 的用法
  10. JavaScript 中的事件流和事件处理程序(读书笔记思维导图)
  11. AS3加载外部swf资源库中的元件(MovieClip)
  12. 刘国梁上任后的“第三把火” 重罚周雨欲意何为?
  13. python N位水仙花数
  14. 为什么不建议把数据库部署在 Docker 容器内?
  15. python皮森发音_python 怎么读
  16. WinEdt中英文字体调节
  17. 2022亚马逊云科re:Invent,打开行业新格局
  18. 【工具】Github copilot 安装扩展后无图标问题
  19. Win11推出新的媒体播放器程序,旨进一步提升用户体验
  20. data,bss和rodata段的区别与联系

热门文章

  1. Socket编程实战
  2. android keytool 不是内部命令或外部命令在 (win7下不能用的解决方法)
  3. SQL server(MSSQL)客户端工具登录数据库的两种命令行登录方式
  4. Objective-C中NSString转NSNumber的方法
  5. 教程:从FLASH过渡到SILVERLIGHT.(实例+源码)
  6. 自画菜单中如何触发MeasureItem事件的问题及解决办法
  7. 2018中国计算机大会,阿里云分布式存储架构师:自研分布式文件系统服务
  8. 与Susan Fowler探讨生产就绪微服务之问答
  9. HTML5 手机端动态适配
  10. 一、预备知识―程序的内存分配