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. 【光纤通信】关于RFA(喇曼光纤放大器)
  2. Android开发热门前沿知识,成功定级腾讯T3-2
  3. js移除字符串的中文/空格
  4. 教你一招快速打开idea的秘诀
  5. 抽象工厂模式设计模式_21世纪的设计模式:抽象工厂模式
  6. Java---利用程序实现在控制台聊天
  7. 有关C语言联合体(union)的使用
  8. 关于软件实施经验分享
  9. 元宇宙大战,一触即发!Unity豪掷16亿美元收购阿凡达幕后特效公司Weta
  10. PCB检查流程checklist
  11. 局域网***原理与防御(网络执法官类)
  12. 数商云跨境电商供应链平台方案,提供全链条的跨境供应链服务
  13. 阿里巴巴sign参数解密
  14. Linux必会100个命令(三十六)gzip
  15. vue随笔之二类型判断一
  16. 前端打包之后 运用nginx反向代理运行项目
  17. ORAN专题系列-21:主要的玩家(设备商)以及他们各自的态度、擅长领域
  18. Visualizing Search Results with Solr /browse Velocity
  19. Nelder-Mead(内德-米德)算法
  20. Eureka(02-入门)Eureka是什么

热门文章

  1. java中有几种内部类,Java中的四种内部类
  2. 内存管理相关【内存布局内存管理方案】
  3. oracle遍历表做查询,oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)...
  4. Python_基础_6
  5. Spring事务处理时自我调用的解决方案及一些实现方式的风险
  6. Maven类包冲突终极解决小技若干
  7. matlab安装配置VLFeat库
  8. OpenCV中OrbDescriptorExtractor
  9. 微信公众号手机无法直接下载APK文件是怎么回事
  10. 《Web前端工程师修炼之道(原书第4版)》——我该从哪里开始呢