1. make的优点

2.makefile基本语法

目标(target):目标文件1 目标文件2gcc -o 欲新建的可执行文件 目标文件1 目标文件2

3.实例

现在我们有如下三个文件
main.c tool.c tool.h

文件内容如下
main.c

#include "tool.h"
#include <stdio.h>int main()
{int arr[5] = {1,8,6,3,4};int m = find_max(arr,5);printf("%d\n",m);return 0;
}

tool.c

#include "tool.h"int find_max(int arr[],int n)
{int m = arr[0];int i;for(i=0;i<n;i++){if(arr[i]>m)m = arr[i];}return m;
}

tool.h

int find_max(int arr[],int n);
makefile文件按照以下格式写
mian:main.c tool.ogcc main.c tool.o -o maintool.o:tool.c gcc -c tool.cclean:rm *.o main

命令行执行make

[ubuntu@VM-48-245-ubuntu ~/makefile_test]$ make

可以看到输出文件如下

main  main.c  makefile  tool.c  tool.h  tool.o

clean是用于删除.o结尾的文件和main文件,执行make clean

make clean

之后文件只剩下

main.c  makefile  tool.c  tool.h

实例2

现在有如下文件

bar.h  foo.c  foo.o  main.c  bar.c   bar.o  foo.h  

bar.h代码如下

#include "bar.h"int find_min(int arr[],int n)
{int m = arr[0];int i;for(i=0;i<n;i++){if(arr[i]<m)m = arr[i];}return m;
}

foo.c代码如下

#include "foo.h"int find_max(int arr[],int n)
{int m = arr[0];int i;for(i=0;i<n;i++){if(arr[i]>m)m = arr[i];}return m;
}

bar.h和foo.h分别是两个函数的声明,这里不再列出,然后是main.c文件,如下

#include "foo.h"
#include "bar.h"
#include <stdio.h>int main()
{int arr[] = {1,8,3,4,5};int min = find_min(arr,5);int max = find_max(arr,5);printf("min = %d\n",min);printf("max = %d\n",max);return 0;
}

makefile如下

main:main.c foo.o bar.ogcc main.c foo.o bar.o -o main
foo.o:foo.cgcc -c foo.c
bar.o:bar.cgcc -c bar.c
clean:rm *.o main

使用shell script变量简化makefile

变量的基本语法:
1.变量最好以“大写字母”为主
2.运用变量时,以 ${变量} 或 $(变量) 使用
此时makefile可以更改为

CC = gccmain:main.c foo.o bar.o$(CC) main.c foo.o bar.o -o main
foo.o:foo.c$(CC) -c foo.c
bar.o:bar.c$(CC) -c bar.c
clean:rm *.o main

以后如果我们想用g++编译的话,就可以把第一行gcc改为g++
如果我们想加入链接时也可以使用变量来替换.

实例3

如果我们现在讲上面的main.c拆成两个分别为main_max.c和main_min.c
main_max.c

#include "foo.h"
#include "bar.h"
#include <stdio.h>int main()
{int arr[] = {1,8,3,4,5};int max = find_max(arr,5);printf("max = %d\n",max);return 0;
}

更改makefile文件如下

CC = gccmain_max:main_max.c foo.o bar.o$(CC) main_max.c foo.o bar.o -o main_max
main_min:main_min.c foo.o bar.o$(CC) main_min.c foo.o bar.o -o main_min
foo.o:foo.c$(CC) -c foo.c
bar.o:bar.c$(CC) -c bar.c
clean:rm *.o main

执行make后,发现只执行了第一条记录

为了全部执行,将makefile更改如下

CC = gcc
all:main_max main_min
main_max:main_max.c foo.o bar.o$(CC) main_max.c foo.o bar.o -o main_max
main_min:main_min.c foo.o bar.o$(CC) main_min.c foo.o bar.o -o main_min
foo.o:foo.c$(CC) -c foo.c
bar.o:bar.c$(CC) -c bar.c
clean:rm *.o main

现在两个都可以编译了

可以看到两个文件都已出现

Linux-makefile相关推荐

  1. linux makefile 只能使用Tab键进行文本缩进

    在编写完linux Makefile后,在控制台输入make命令编译文件时报错,错误信息:"Makefile:13:*** 遗漏分隔符".查看Makefile文件内容,没有发现问题 ...

  2. Linux Makefile自动生成--config.h

    2019独角兽企业重金招聘Python工程师标准>>> Linux Makefile自动生成--总体流程 Linux Makefile自动生成--实例 Linux Makefile自 ...

  3. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序...

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

  4. linux下如何make文件夹,Linux makefile 教程 非常详细,且易懂

    http://blog.csdn.net/liang13664759/article/details/1771246 Linux makefile 教程 非常详细,且易懂 1.Makefile用途 使 ...

  5. 【Linux + Makefile】Makefile中的.PHONY作用以及赋值运算(各种=符号)的区别

    笔者常年在Linux环境编程,经常在项目中与Makefile打交道,最近总结了几个Makefile的小的知识点,分享给大家. 通过阅读本文,你将了解到以下知识: 1.Makefilke中的.PHONY ...

  6. 【Linux + Makefile】十分钟教你学会Makefile的FORCE

    相信大家在使用Linux环境编程的时候,一定接触过Makefile这个玩意.Makefile在搭建自定义的编译环境,尤其是自动化编译.多功能一键编译等功能上,还是发挥了很大的作用.如果接触过Linux ...

  7. linux makefile 框架分析1

    主Makefile [17] MAKECMDGOALS: 命令行传入的构建对象 [22] __all : 默认目标 [40] sub_make_done: 存在的意义,构建框架存在递归调用的行为,而对 ...

  8. 内核编程Makefile名开头要大写,scripts/Makefile.build:44: /home/linux/Makefile: 没有那个文件或目录

    内核模块编程-makefile make -C /home/linux/linux-5.10.61/ M=/home/linux modules make[1]: 进入目录"/home/li ...

  9. Linux makefile 教程

    最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...

  10. Linux makefile中的= := ?=操作符

    在Linux的makefile中,可以使用=,:=,?=赋值语句,但是它们的含义是不同的.下面分别说明: = 是变量在使用的时候才真正的把值赋给它,也就是说延迟赋值. := 即时赋值,不会等到真正使用 ...

最新文章

  1. 位操作-按位与之如何求二进制数的1个数
  2. R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend
  3. 最新版OpenWrt编译教程,解决依赖问题
  4. [转]解决Android studio升级到3.5的一些问题
  5. idea展示runDashboard的窗口
  6. Unity Shader:雾的数学运算以及在Unity中使用Fog
  7. JunitTest上集
  8. SylixOS lsusb命令解析
  9. Spring Cache 介绍
  10. 如何确定autosar的版本_从工程师的角度看AUTOSAR
  11. 计算机加密是什么意思,bitlocker驱动加密是什么意思?
  12. 2022-08-26 Unity视频播放3——VideoPlayer
  13. 利用EMCP物联网云平台通过手机APP和微信监控西门子S7-1200PLC云组态
  14. 零食社交 or 甜蜜陷阱?说说公司那些免费提供的零食饮料
  15. IOS OC UIKit基本使用
  16. 泛型编程和STL基础学习(C++)(未完待续)
  17. Axure 点图片外区域即隐藏_AXURE教程:用中继器做一个手机版内容分享原型
  18. 25. 获取员工其当前的薪水比其manager当前薪水还高的相关信息
  19. 今天来详细说一说贴片三极管
  20. 三年级学生计算机学情分析,小学三年级信息技术教学计划范文

热门文章

  1. linux开发板蓝牙连接,开发板蓝牙通信问题,有这方面经验的请进
  2. mysql 外键有啥用途_Mysql外键是什么?有哪些用处?(图文+视频)
  3. 机器人科迪的天空_机器人科迪的天空游戏评测:我要跳的更高
  4. Ubuntu14.04下安装wineqq国际版和卸载QQ
  5. Dubbo 源码分析 - 集群容错之Directory
  6. 利用RANSAC算法筛选SIFT特征匹配
  7. 《Effective STL》学习笔记(第四部分)
  8. 大话设计模式(十 会修电脑不会修收音机?——聊设计模式原则)
  9. RediSQL 0.8.0 发布,将查询结果写入流中
  10. pytorch的一些函数