Linux makefile讲解
博客不会讲解的太细致深入,推荐先看视频再看博客
视频链接,推荐去B站观看,B站比较清晰...
土豆网:http://www.tudou.com/programs/view/19VZ0f3b_I0
B站: http://www.bilibili.com/video/av9655080/
在linux中编译.c文件的时候,可以用gcc命令,当然了,如果是100个.c文件你怎么办?这个时候你最好创建一套规则来使用,这时我们就用到了makefile,一切东西的发明创造都是为了方便。
现在我有一个.c文件叫test.c,内容如下:
#include <stdio.h>
void main()
{
printf("hello wold! \n");
}
然后嘞,我用makefile来搞定它!(注意这是在同一个目录下的哦)
test:test.o //目标:依赖关系
gcc test.o -o test //注意!这里的是tab键,不是空格,不打tab键会出错的
test.o:test.c
gcc -c test.c -o test.o
clean:
rm *.o test
这就是一个最简单的makefile啦,执行的时候只需要make一下就ok了 (如果你看不懂就去看我的视频,我会讲解为什么要这么写)
看过上面的例子之后可能有人会说makefile的优越性在哪?别急,下面我们来6个.c文件,分别是 m.c m.h visit.c play.c listen.c watch.c study.c
m.c
#include <stdio.h>
void main()
{
int i;
printf("please input the value of i from 1 to 5 :\n");
scanf("%d",&i);
if(i==)
visit();
else if(i==)
study();
else if(i==)
play();
else if(i==)
watch();
else if(i==)
listen();
else
printf("nothing to do \n");
printf("This is a woderful day\n"); }
study.c
#include <stdio.h>
void main()
{
void study()
{
printf("study embedded system today \n");
}
}
listen.c
#include <stdio.h>
void main()
{
void listen()
{
printf("listen english today \n");
}
}
play.c
#include <stdio.h>
void main()
{
void study()
{
printf("play football today \n");
}
}
visit.c
#include <stdio.h>
void main()
{
void study()
{
printf("visit friend today \n");
}
}
watch.c
#include <stdio.h>
void main()
{
void watch()
{
printf("watch TV today \n");
}
}
我是不是写了一个m.h文件?这个叫头文件,也叫引用文件,因为m.c里面用了visit(),play()...方法,所以我们也来写一下m.h
void visit();
void listen();
void watch();
void study();
void play();
这里列举了6个.c文件和一个.h文件,现在我们来写makefile
CC=gcc
TARGET=ALL
OBJECTS=m.o visit.o listen.o watch.o study.o play.o
$(TARGET):$(OBJECTS)
$(CC) $(OBJECTS) -o m
m.o:m.c m.h //这里m.o和m.h一起
$(CC) -c m.c -o m.o
visit.o:visit.c
$(CC) -c visit.c -o visit.o
listen.o:listen.c
$(CC) -c listen.c -o listen.o
watch.o:watch.c
$(CC) -c watch.c -o watch.o
study.o:study.c
$(CC) -c study.c -o study.o
play.o:play.c
$(CC) -c play.c -o play.o
clean:
rm *.o m
这个应该很好懂的,最后嘞,我介绍一下怎么使用变量来简化操作
CC=gcc
TARGET=ALL
OBJECTS=m.o visit.o listen.o watch.o study.o play.o
$(TARGET):$(OBJECTS)
$(CC) $(OBJECTS) -o m
m.o:m.c m.h
$(CC) -c m.c -o m.o
*.o:*.c // *可以代替目标名称,因为依赖和目标名一样,所以都可以用*来代替
$(CC) -c $< -o $@ // $<的意思是依赖,$@的意思是目标
clean:
rm *.o
makefile呢分为在同一个文件下面和不同一个文件下面,我只讲了在同一个文件下面,那个大家自己去查也很简单,就酱~
Linux makefile讲解的更多相关文章
- Linux makefile 教程 非常详细,且易懂(转)
转自:http://blog.chinaunix.net/uid-27717694-id-3696246.html 原文地址:Linux makefile 教程 非常详细,且易懂 作者:Deem_pa ...
- Linux Makefile自动生成--config.h
Linux Makefile自动生成--config.h http://blog.csdn.net/spch2008/article/details/12510805
- 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序
很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...
- Linux Makefile文件编写详细步骤与实践
Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...
- 【转】Linux makefile 教程 非常详细,且易懂
From: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...
- Linux makefile 教程 非常详细,且易懂
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- linux Makefile obj-m obj-y
目标定义是Kbuild Makefile的主要部分,也是核心部分.主要是定义了要编 译的文件,所有的选项,以及到哪些子目录去执行递归操作. 最简单的Kbuild makefile 只包含一行: 例子: ...
- Linux makefile 教程 非常详细,且易懂 (转)
概述—— 什么是makefile?或许很多Winodws的程序员都不知道这 个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
- Linux makefile教程之后序十一[转]
后序 —— 终 于到写结束语的时候了,以上基本上就是GNU make的Makefile的所有细节了.其它的产商的make基本上也就是这样的,无论什么样的make,都是以文件的依赖性为基础的,其基本是都 ...
随机推荐
- [CF1067D]Computer Game[凸包/斜率优化+倍增+矩阵乘法]
题意 你有 \(n\) 个任务,初始收益为 \(a\) ,共 \(t\) 轮游戏,每轮可以选择完成一个任务(可以做多次),完成之后可以给任意任务升级,升级之后的任务收益为 \(b\) ,每个任务还有完 ...
- SpringBoot日记——Redis整合
上一篇文章,简单记录了一下缓存的使用方法,这篇文章将把我们熟悉的redis整合进来. 那么如何去整合呢?首先需要下载和安装,为了使用方便,也可以做环境变量的配置. 下载和安装的方法,之前有介绍,在do ...
- 教你用PS制作雨天窗户上透明水滴字
雨天窗户上透明水滴字制作方法很简单,主要利用图层样式来实现.学习后可以让你对图层样式有更好的了解,认识. 先看下完成后的效果图: 步骤1: 在Photoshop中我们新建或Ctrl+N,创建1920x ...
- DRF02
1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...
- EOS开发基础之六:使用cleos命令行客户端操作EOS——智能合约之eosio.msig和eosio.system
上一节我们搞了老半天,也没整明白Exchange这个合约到底干啥用的.就它官方提供的说法,是用于货币的创造和交易.我没整明白,所以去看了下代码,发现代码头文件里面有下面这段话: This contra ...
- Celery基本使用
Celery 什么是Celery? Celery是一种简单/高效/灵活的即插即用的分布式任务队列. Celery应用场景? 需要异步处理的任务,发邮件/发短信/上传等耗时的操作.最终到达提升用户体验的 ...
- Vivado绑定外部verilog编辑器
前言 由于Vivado自带的verilog编辑器确实难用,写起来效率不高,因而寻找到了以下教程. 解决方案 引用sublime作为vivado外部verilog编辑器 sublime text中文编码 ...
- 从零开始学Kotlin-数据类型(2)
从零开始学Kotlin基础篇系列文章 基本数据类型 Kotlin 的基本数值类型包括 Byte.Short.Int.Long.Float.Double 等: 数据-------位宽度 Double-- ...
- tp5+layui 实现上传大文件
前言: 之前所写的文件上传类通常进行考虑的是文件的类型.大小是否符合要求条件.当上传大文件时就要考虑到php的配置和服务器的配置问题.之前简单的觉得只要将php.ini中的表单上传的 大小,单脚本执行 ...
- USACO 2012 December ZQUOJ 24122 Scrambled Letters(二分)
题意:有一个字典序名单,现在把这些名单的顺序和名字的字符顺序扰乱了,要输出原先的名字在原来的名单中的最低和最高位置. 分析:先将所有的名字串按字典序从小到大和从大到小分别排序smin[]和smax[] ...