Linux-makefile
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相关推荐
- linux makefile 只能使用Tab键进行文本缩进
在编写完linux Makefile后,在控制台输入make命令编译文件时报错,错误信息:"Makefile:13:*** 遗漏分隔符".查看Makefile文件内容,没有发现问题 ...
- Linux Makefile自动生成--config.h
2019独角兽企业重金招聘Python工程师标准>>> Linux Makefile自动生成--总体流程 Linux Makefile自动生成--实例 Linux Makefile自 ...
- 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序...
很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...
- linux下如何make文件夹,Linux makefile 教程 非常详细,且易懂
http://blog.csdn.net/liang13664759/article/details/1771246 Linux makefile 教程 非常详细,且易懂 1.Makefile用途 使 ...
- 【Linux + Makefile】Makefile中的.PHONY作用以及赋值运算(各种=符号)的区别
笔者常年在Linux环境编程,经常在项目中与Makefile打交道,最近总结了几个Makefile的小的知识点,分享给大家. 通过阅读本文,你将了解到以下知识: 1.Makefilke中的.PHONY ...
- 【Linux + Makefile】十分钟教你学会Makefile的FORCE
相信大家在使用Linux环境编程的时候,一定接触过Makefile这个玩意.Makefile在搭建自定义的编译环境,尤其是自动化编译.多功能一键编译等功能上,还是发挥了很大的作用.如果接触过Linux ...
- linux makefile 框架分析1
主Makefile [17] MAKECMDGOALS: 命令行传入的构建对象 [22] __all : 默认目标 [40] sub_make_done: 存在的意义,构建框架存在递归调用的行为,而对 ...
- 内核编程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 ...
- Linux makefile 教程
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- Linux makefile中的= := ?=操作符
在Linux的makefile中,可以使用=,:=,?=赋值语句,但是它们的含义是不同的.下面分别说明: = 是变量在使用的时候才真正的把值赋给它,也就是说延迟赋值. := 即时赋值,不会等到真正使用 ...
最新文章
- 位操作-按位与之如何求二进制数的1个数
- R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend
- 最新版OpenWrt编译教程,解决依赖问题
- [转]解决Android studio升级到3.5的一些问题
- idea展示runDashboard的窗口
- Unity Shader:雾的数学运算以及在Unity中使用Fog
- JunitTest上集
- SylixOS lsusb命令解析
- Spring Cache 介绍
- 如何确定autosar的版本_从工程师的角度看AUTOSAR
- 计算机加密是什么意思,bitlocker驱动加密是什么意思?
- 2022-08-26 Unity视频播放3——VideoPlayer
- 利用EMCP物联网云平台通过手机APP和微信监控西门子S7-1200PLC云组态
- 零食社交 or 甜蜜陷阱?说说公司那些免费提供的零食饮料
- IOS OC UIKit基本使用
- 泛型编程和STL基础学习(C++)(未完待续)
- Axure 点图片外区域即隐藏_AXURE教程:用中继器做一个手机版内容分享原型
- 25. 获取员工其当前的薪水比其manager当前薪水还高的相关信息
- 今天来详细说一说贴片三极管
- 三年级学生计算机学情分析,小学三年级信息技术教学计划范文
热门文章
- linux开发板蓝牙连接,开发板蓝牙通信问题,有这方面经验的请进
- mysql 外键有啥用途_Mysql外键是什么?有哪些用处?(图文+视频)
- 机器人科迪的天空_机器人科迪的天空游戏评测:我要跳的更高
- Ubuntu14.04下安装wineqq国际版和卸载QQ
- Dubbo 源码分析 - 集群容错之Directory
- 利用RANSAC算法筛选SIFT特征匹配
- 《Effective STL》学习笔记(第四部分)
- 大话设计模式(十 会修电脑不会修收音机?——聊设计模式原则)
- RediSQL 0.8.0 发布,将查询结果写入流中
- pytorch的一些函数