make与makefile入门介绍

1.什么是make

代码变成可执行文件, 叫做编译(compile),先编译这个, 还是先编译那个(即编译的安排), 叫做构建(build)。

make是最常用的构建工具,主要用于C/C++的项目. gcc与g++是常用的编译工具

2.Makefile

make默认会根据Makefile文件中的指令来构建,也可以在参数中指定makefile

指定makefile的参数: -f FILE, --file=FILE, --makefile=FILE

3.make的安装

(1)CentOS默认已经带有make

(2)Windows可以安装msys2

4.Makefile的编写

(1)Makefile文件由一系列规则(rules)构成。每条规则的形式如下:

      <target> : <prerequisites> 
      [tab]  <commands>

上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。

"目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。

(2)target - 目标

一般一个目标为一个文件,如 hello.o

除了文件名,目标还可以是某个操作的名字,这称为"伪目标"(phony target)

如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标

(3)前置条件(prerequisites)

前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建

(4)命令(commands)

命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。

每行命令之前必须有一个tab键。如果想用其他键,可以用内置变量.RECIPEPREFIX声明.

注意: 每行命令在一个单独的shell中执行。这些Shell之间没有继承关系

5.Makefile的语法

(1)# 在Makefile中表示注释

(2)在命令的前面加上@,就可以关闭回显

(3)Makefile 允许使用等号自定义变量, 可以在rules外定义,如:

txt = Hello World

调用时,变量需要放在 $( ) 之中

(4)内置变量

CXX: C++编译器,默认为g++

(5)自动变量

$@指代当前目标

$< 指代第一个前置条件

6.Makefile中的其他细节

(1)makefile中的加号+,减号-和at号@的含义

@ 使命令在被执行前不被回显

- 使任何命令行的任何非零退出状态都被忽略。

7.示例的Makefile

(1)hello.cpp

#include<stdio.h>

int main()
{
    printf("hello world\n");
    return 0;
}

(2)Makefile for hello.cpp

all:hello.exe hello2.exe # makefile默认仅执行第1个rule,因此将第1个rule设置为所有的输出

hello.o : hello.cpp # hello.cpp是hello.o的前提
	@echo building $@, the prerequisites is $<
	g++ -c hello.cpp -o hello.o

hello.exe : hello.o # hello.o是hello.exe的前提
	@echo building $@, the prerequisites is $<
	g++ hello.o -o hello.exe
	
hello2.exe : hello.cpp # 从hello.cpp直接编译出exe
	@echo building $@, the prerequisites is $<
	g++ hello.cpp -o hello2.exe
	
clean :
	-rm hello.o
	-rm hello.exe
	-rm hello2.exe

install : 
	-@test -d bin || mkdir bin
	cp -frv hello.exe bin/hello.exe
	cp -frv hello2.exe bin/hello2.exe

.PHONY: clean all install
# 伪目标,声明clean是"伪目标"之后,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令

6.参考

(1)阮一峰的Make命令教程: Make 命令教程 - 阮一峰的网络日志

(2)make官方文档: GNU make

(3)makefile中的加号+,减号-和at号@的含义: https://www.cnblogs.com/leaven/p/4337628.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值