Win10 下引入 makefile

今天 C++ 课上初步介绍了 Linux 下 makefile 的编写,总体来说非常方便,而且更加有利于我们理解 C/C++ 的运行机制,于是我想把它搬运到 Win10 环境使用。

首先确保预先配置好 MinGW,下面介绍的是 vscode 下的使用。

我们在 Win10 下使用的 make,其实是 …/MinGW/bin/ 下的 mingw32-make.exe 这个可执行文件,你可以选择把它改名为 make.exe, 与 Linux 保持一致,或者干脆保持原名,当然还有很多其他的方式,这里不作展开。

vscode 下创建一个新文件夹,点击工具栏中的终端 => 配置默认生成任务,修改出现的 tasks.json,如下图:

F5,会自动生成一个 launch.json,无需做多少改动。

初步编写 makefile

首先我写了个简单的 C++ 程序 main.cpp,作为演示:

makefile 的基本组成单位格式如下:

target...: prerequisite...
    command...

我们一般会在最后添加一个

clean:
    command...

作为一个清除 make 生成文件的方法。

这样,当我们输入命令 make clean,我们就会执行 command 的内容。

于是我编写了如下文件作为上面 main.cpp 的 makefile:

简单解释一下:

第一二行,test.exe 是我们的目标文件,main.o 是我们生成目标文件所需要的文件,在这个过程中我们需要用到的命令是 g++ main.o -o test.exe。三四行类似,不做介绍。

五六行,是我们运行 make clean 时执行的 shell 命令,del *.o *.exe,也就是删除当前目录下所有 .o .exe 后缀的文件。

当文件变得更多…

我们引入了新的头文件和源文件,add.h 和 add.cpp,来为我们的程序添加加法运算的函数,这个时候我们就不得不修改我们的 makefile 了。

// add.h
#ifndef __ADD_H__
#define __ADD_H__

int add(int x, int y);

#endif
// add.cpp
#include "add.h"

int add(int x, int y) { return x + y; }
// main.cpp
#include <iostream>
#include "add.h"

int main() {
    std::cout << add(5, 6) << std::endl;
    return 0;
}

于是我们修改 makefile 为:

然而问题来了,随着我们程序的体量不断变大,这样的 makefile 会变得难以维护。这就是我们接下来要讨论的。

makefile++

变量

引入变量

${变量名},这点和 shell 脚本很像。

变量的定义

变量名 = 变量要替代的文本(无需引号,如果文本过长,可以用 \ 来多行输入)

变量名 := 变量需要替代的文本。二者的区别是, = 的 rhs 可以使用后文定义的变量,而 := 的 rhs 只能使用前文定义好的变量。

例如:

k = ${object}
object = main.o add.o
test.exe: ${object}
	g++ ${k} -o test.exe

这么写就无法成功 make。

变量追加值

例如: object += subduct.o

变量覆写

使用 override,目的是让 makefile 中定义的变量可以覆盖 make 命令参数中变量的值。

目标变量

目标名: 变量定义,这种写法使得定义的变量只对某一个目标起作用。

%.o: %.cpp

%.o 代表了所有需要的 .o 文件的集合,%.cpp 类似。

自动变量

根据上面的规则,我们的 makefile 修改如下:

进阶参考链接

本文大概记录这么多,更多内容可见:https://www.cnblogs.com/wang_yb/p/3990952.html 这篇文章,写的非常详细。

Offensive77

A little learning is a dangerous thing.

4 Comments

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注