我们编写的大型程序往往由多个编译单元(或者说,多个源代码文件)构成。因此,构建应用时,发出的编译命令可能会比较长。

另外,在开发过程中,可能只修改了一些而不是全部的编译单元,因此在构建时,只需重新编译修改过的编译单元,再重新链接即可。

为达到此目的,推荐的构建方式是使用make工具。

一、安装make

打开一个Linux终端,在其中发出如下命令,用来安装make

sudo apt install make

二、make的依赖文件

使用make工具需要编写一个依赖文件。以下是两个很简单的make工具默认依赖文件Makefile的样本:

# for C program
# 以下是变量定义
# 指定编译器
CC = gcc
# 指定编译选项:打开所有编译警告、调试模式、启用内存消毒器
cflags = -Wall -g -fsanitize=address
# 指定编译单元(源程序)列表
sources = main.c list.c
# 指定可执行代码名字
target = list

# 定义一个叫all的任务
# 这个任务下的命令必须用tab缩进,不能是空格
all:
    $(CC) $(cflags) $(sources) -o $(target)
# 上述命令解释为:启动$(CC)指定的命令,并将后面的一串参数传递给它
# 这个例子中,命令为:启动gcc编译器,将编译选项传递给它,编译、链接源文件main.c和list.c,生成一个可执行代码list。

# 定义一个叫clean的任务
# 此任务将清除生成的可执行代码
clean:
    rm $(target)
# for C++ program
CXX = g++
# 选项-std指定C++标准。如果你的g++版本低于10,那么请将c++20换成c++17;如果低于7,则换成c++11。
cxxflags = -Wall -g -fsanitize=address -std=c++20
sources = main.cpp list.cpp
target = list

all:
    $(CXX) $(cxxflags) $(sources) -o $(target)

# 定义一个叫install的任务
# 此任务将生成的可执行代码(以及相关资源)安装到指定地点
install:
    sudo cp $(target) /usr/bin

更多的关于make依赖文件的知识,请自行查阅相关资料。

三、使用make构建应用

假设程序源代码和Makefile都放在E:\prog目录下,那么在Linux终端中,可以发出如下命令来构建:

cd /mnt/e/prog
make

这里,make工具将会使用默认的依赖文件Makefile,并执行其中定义的all任务进行构建。

四、指定make的依赖文件

如果你不想用默认的文件名Makefile,例如把它命名为list.mk,那么可以这么构建:

make –f list.mk

五、执行其他任务

make install
make clean

六、跨平台的考虑

make工具一般只在UNIX系统下提供,其他平台–例如Windows–上的构建工具(例如MinGW、MS VC++等等)可能不是make,或者名字不一样。这里给出一些建议。

  1. 改名

    对于类似于MinGW类的编译环境(例如MinGW、C Free、DevC++)等等,可以这么做:找到编译环境下的mingw/bin目录,再将其下的mingw32-make.exe复制一份,并将副本改名为make.exe

    VC++的nmake工具比较特殊,所以无法通过改名达到目标。

  2. 使用CMake

    CMake是一种跨平台make依赖文件生成工具,即它本身不是make,而是根据指定的配置参数,生成该平台下的make依赖文件,再使用平台提供的make工具进行构建。 更多关于CMake的使用,请参阅相关资料。