前言

本文通过几个简单的示例,可以快速了解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 | 基础用法的更多相关文章

  1. 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会

    最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...

  2. Docker基础用法篇

    Docker基础用法篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装docker 1>.依赖的基础环境 64 bits CPU Linux Kerner 3.10+ ...

  3. PropertyGrid控件由浅入深(二):基础用法

    目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...

  4. logstash安装与基础用法

    若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...

  5. elasticsearch安装与基础用法

    来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...

  6. BigDecimal最基础用法

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  7. makefile高级用法--使用函数

    makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...

  8. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  9. Smarty基础用法

    一.Smarty基础用法: 1.基础用法如下 include './smarty/Smarty.class.php';//引入smarty类 $smarty = new Smarty();//实例化s ...

  10. 前端自动化测试神器-Katalon的基础用法

    前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...

随机推荐

  1. 你不知道的JavaScript APIs

    前言 在本文中,将介绍一些鲜为人知但却非常有用的API,如: Page Visibility API Web Share API Broadcast Channel API International ...

  2. [转帖]RabbitMQ学习笔记:内置Prometheus支持rabbit_prometheus插件

    从3.8.0开始,RabbitMQ提供内置的Prometheus和Grafana支持. rabbitmq_prometheus插件中提供了对Prometheus指标收集的支持.该插件以Promethe ...

  3. [转帖]技术分享| MySQL 的 AWR Report?— MySQL 状态诊断报告

    https://segmentfault.com/a/1190000039959767     作者:秦福朗 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查.热爱 IT,喜欢在互联网 ...

  4. Docker 安装Oracle12c的镜像修改字符集 并且进行启动的简单过程

    学习来自 昨天晚上转帖的文章 这里面添加一些自己的内容 首先获取配置文件 git clone https://github.com/oracle/docker-images.git 获取之后比较容易了 ...

  5. Fabric-ca client端初始化过程源码分析

    本文从Fabric-ca源码入手,以newRegisterCommand()函数为例,简单分析client启动时的过程.Fabric-ca源码可以从github.com下载,本文以v1.4.6为例进行 ...

  6. .net Core IsDefined、GetValues、HasFlag 使用

    IsDefined可以用于判断传入的单个值是否属于该枚举 GetValues检索指定枚举中常量值的数组 HasFlag 可以用于判断传入的多个值是否属于该枚举 先来个例子: public enum B ...

  7. 使用C#做为游戏开发的服务器语言方案

    Scut开源服务器 开源C#/Python/Lua 手游服务器 主页:http://www.scutgame.com/index.html 开源:https://github.com/ScutGame ...

  8. 未能加载文件或程序集“System.ValueTuple, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。

    一些老的项目在使用SAEA.Socket相关库后,程序本地测试正常,结果上传到服务器上后提示:未能加载文件或程序集"System.ValueTuple, Version=0.0.0.0, C ...

  9. endnote文献使用简明教程+遇到问题

    安装下载endnote 1.双击[EndNote X9 v19.0.0.12062 Setup.msi]安装EndNote X9,安装时选择试用,安装完成后不要运行EndNote: 2.如果想使用汉化 ...

  10. 4.5 C++ Boost 文件目录操作库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...