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中,可以使用=,:=,?=赋值语句,但是它们的含义是不同的.下面分别说明: = 是变量在使用的时候才真正的把值赋给它,也就是说延迟赋值. := 即时赋值,不会等到真正使用 ...
最新文章
- 【光纤通信】关于RFA(喇曼光纤放大器)
- Android开发热门前沿知识,成功定级腾讯T3-2
- js移除字符串的中文/空格
- 教你一招快速打开idea的秘诀
- 抽象工厂模式设计模式_21世纪的设计模式:抽象工厂模式
- Java---利用程序实现在控制台聊天
- 有关C语言联合体(union)的使用
- 关于软件实施经验分享
- 元宇宙大战,一触即发!Unity豪掷16亿美元收购阿凡达幕后特效公司Weta
- PCB检查流程checklist
- 局域网***原理与防御(网络执法官类)
- 数商云跨境电商供应链平台方案,提供全链条的跨境供应链服务
- 阿里巴巴sign参数解密
- Linux必会100个命令(三十六)gzip
- vue随笔之二类型判断一
- 前端打包之后 运用nginx反向代理运行项目
- ORAN专题系列-21:主要的玩家(设备商)以及他们各自的态度、擅长领域
- Visualizing Search Results with Solr /browse Velocity
- Nelder-Mead(内德-米德)算法
- Eureka(02-入门)Eureka是什么
热门文章
- java中有几种内部类,Java中的四种内部类
- 内存管理相关【内存布局内存管理方案】
- oracle遍历表做查询,oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)...
- Python_基础_6
- Spring事务处理时自我调用的解决方案及一些实现方式的风险
- Maven类包冲突终极解决小技若干
- matlab安装配置VLFeat库
- OpenCV中OrbDescriptorExtractor
- 微信公众号手机无法直接下载APK文件是怎么回事
- 《Web前端工程师修炼之道(原书第4版)》——我该从哪里开始呢