首页 > 其他分享 >轻松玩转Makefile | 基础用法

轻松玩转Makefile | 基础用法

时间:2023-03-01 13:56:43浏览次数:32  
标签:gcc make Makefile 用法 玩转 clean fun main

前言

本文通过几个简单的示例,可以快速了解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可以大大提升效率,且便于维护。

标签:gcc,make,Makefile,用法,玩转,clean,fun,main
From: https://www.cnblogs.com/Wayne123/p/17167907.html

相关文章

  • makefile中PHONY的重要性
       伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签。伪目标通过  PHONY来......
  • 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(9)-Charles如何修改请求参数和
    1.简介宏哥之前一直用postman调接口比较多(web端),也非常容易上手和操作。但有时候想要去修改APP的页面展示,造数据又会比较麻烦,你自己造相对还好些,要是让开发造,还得低眉顺眼......
  • C++for循环新用法
    1、拷贝range的元素时,使用for(autox:range).2、修改range的元素时,使用for(auto&x:range).3、只读range的元素时,使用for(constauto&x:range).#include<iost......
  • 控制台安装虚拟环境常见指令和用法
    查看conda信息(版本,安装位置等等)condainfo创建一个新的虚拟环境condacreate-nyour_env_namecondacreate-nyour_env_namepython=3.9.2(带python版本的创建)激......
  • getattr的用法
    getattr() 函数用于返回一个对象属性值。  object--对象。name--字符串,对象属性。default--默认返回值,如果不提供该参数,在没有对应属性时,将触发Attribute......
  • global与nonlocal关键字、函数名的多种用法、函数的嵌套调用、函数的嵌套定义、闭包函
    目录一、global与nonlocal关键字二、函数名的多种用法三、函数的嵌套调用四、函数的嵌套定义五、闭包函数六、装饰器简介一、global与nonlocal关键字global方法:用于局部......
  • jmeter(三)、控制器简单用法
      一、if控制器  ${__groovy(${yq_id}>0,)}  二、循环控制器 ......
  • KingbaseES Returning 的用法
    概述数据表更新时,如果需要对修改前后的数据进行记录或比较,需要返回更新前后的数据。KingbaseES可以通过UPDATE语句是否能直接返回影响的数据。KingbaseES支持insert,de......
  • Lazy用法
    publicclassStudentInfo{publicstaticStudentInfostudentLazy=newLazy<StudentInfo>(()=>newStudentInfo()).Value;publicintSt......
  • lsof命令用法
    一、lsof命令介绍lsof(listopenfiles)命令可以列出当前系统已经打开的所有文件。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访......