轻松玩转Makefile | 基础用法
前言
本文通过几个简单的示例,可以快速了解Makefile的基本使用方法,适用于编译我们平时练习所编写的小量代码。
1. make命令
Makefile文件内容: all为目标,这里没有依赖的文件,这条命令是打印(echo)出“Hello Makefile”这行文字
all:
echo "Hello Makefile"
运行make后,终端打印的内容
$ make
echo "Hello Makefile"
Hello Makefile
可以看到,Makefile的命令也打印在了终端,要想不输出命令的内容,可以在命令前面加上@
make可以指定要生成的目标,如果不指定,则默认第一个目标,我们将Makefile文件内容修改一下
all:
@echo "Hello Makefile"
test:
@echo "Hello Test"
运行不同的命令,可以看到不同的打印信息
$ make
Hello Makefile
$ make all
Hello Makefile
$ make test
Hello Test
2. 生成文件
假设现在有两个文件fun.c和main.c,需要利用Makefile生成一个可执行文件app。
fun.c的内容
#include <stdio.h>
void fun()
{
printf("This is fun()!\n");
}
main.c的内容
extern void fun();
int main()
{
fun();
return 0;
}
Makefile的内容
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
当执行make命令后,终端会打印下列内容,并生成对应的app , main.o ,fun.o文件
gcc -o main.o -c main.c
gcc -o fun.o -c fun.c
gcc -o app main.o fun.o
3. 清除文件
依旧是上面的Makefile和源文件,我们输入make clean,就可以清除刚刚生成的3个文件。打印信息如下:
$ make clean
rm app main.o fun.o
假如Makfile目录中,有名为clean文件,make之后再执行make clean又会发生什么呢?
我们输入touch clean产生一个空的文件,再执行make clean,观察现象
$ touch clean
$ make clean
$ make: 'clean' is up to date.
此时make提醒clean文件是最新的,而不是执行清除操作。
要解决这个问题,我们就得引入伪目标。
伪目标
伪目标采用".PHONY" 关键字来定义, 且必须是大写字母。修改一下上面的Makefile
.PHONY:clean
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
输入make clean,我们会发现此时能够正常执行清除操作。
makefile内容的注释
在Makefile文件中,有些内容我们需要写一下备注,或者暂时不需要了,想注释掉,需要怎么操作呢。很简单,只需要在需要注释的那行前面加上#号即可,像下面这样
#这是的Makefile的注释
#all: main.o fun.o
.PHONY:clean
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
本文所介绍的Makefile,应付几个文件的编译还可以,在实际的工程中,会有几十个、上百个文件。要是都一个个这样按文件名书写,效率太低,且不好维护。后面的文章,我将会介绍Makefile的变量和函数,利用它们,我们的Makefile可以大大提升效率,且便于维护。
轻松玩转Makefile | 基础用法的更多相关文章
- 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会
最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...
- Docker基础用法篇
Docker基础用法篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装docker 1>.依赖的基础环境 64 bits CPU Linux Kerner 3.10+ ...
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- logstash安装与基础用法
若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...
- elasticsearch安装与基础用法
来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...
- BigDecimal最基础用法
BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...
- makefile高级用法--使用函数
makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...
- Vue组件基础用法
前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...
- Smarty基础用法
一.Smarty基础用法: 1.基础用法如下 include './smarty/Smarty.class.php';//引入smarty类 $smarty = new Smarty();//实例化s ...
- 前端自动化测试神器-Katalon的基础用法
前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...
随机推荐
- P5729 【深基5.例7】工艺品制作
1.题目介绍 [深基5.例7]工艺品制作 题目描述 现有一个长宽高分别为 \(w,x,h\) 组成的实心玻璃立方体,可以认为是由 \(1\times1\times1\) 的数个小方块组成的,每个小方块 ...
- 使用华为路由连接WiFi,被限制网速?
1.问题 使用华为路由连接WiFi,但是网速非常慢,经常半天才能加载一个界面? 2.解决方法 登陆http://192.168.3.1/网址,发现限速一栏被框选,取消即可
- android应用申请加入电池优化白名单
首先,在 AndroidManifest.xml 文件中配置一下权限: 1 <uses-permission android:name="android.permission.REQU ...
- 使用requests爬虫遇到的一个奇葩的问题:UnicodeEncodeError: 'latin-1' codec can't encode character
每一位成功的程序员,背后也许都站着无数的秃头的男人--为其提供各种开发工具&代码库,当然也包括-- 各种玄学bug-- 玄学的开端 最近在用Python做一个爬虫项目的时候遇到一个很奇怪的问题 ...
- 重写SpringCloudGateway路由查找算法,性能提升100倍!
如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发 背景 先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中 ...
- [转帖]Redis优化:Redis使用TCMalloc提高内存分配性能
TCMalloc(Thread-Caching Malloc)是google开发的开源工具──"google-perftools"中的成员.与标准的glibc库的malloc相比, ...
- [转帖]Unix Domain Socket– IPC通信机制
什么是Unix Domain Socket 基于socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopba ...
- [转帖]Java 认证与授权(JAAS)介绍
https://www.cnblogs.com/wuyongyin/p/16981469.html JAAS(Java Authentication Authorization Service),即 ...
- [转帖]如何优雅的使用 Systemd 管理服务
https://zhuanlan.zhihu.com/p/271071439 背景:我们在构建 Kubernetes 容器化平台时,会在节点上部署各种 agent ,虽然容器化当道的今天很多程序可以直 ...
- [转帖]shell删除文件前几行或后几行
https://www.cnblogs.com/1394htw/p/14852207.html shell删除文件前几行或后几行 #!/bin/bash #删除前两行 sed -i '1,2d' fi ...