编译安装与CMake相关

巧记

在数据库系统课程的实验使用 MiniOB,首先需要搭建环境进行编译和调试。正好借此机会梳理一下编译安装的过程和要点,留作笔记。

从几种安装方式说起,再具体讨论一下编译安装,以及 GCC、Make、CMake、Makefile、CMakeLists 的关系。

Linux软件安装方式

  1. 包管理器(Package Manager):

    • APT(Advanced Package Tool):用于 Debian 和 Ubuntu 等基于 Debian 的发行版。

      1
      apt install <package_name>
    • DNF(Dandified YUM):用于红帽系发行版(RHEL、Fedora 和 CentOS等),替代了YUM(Yellowdog Updater, Modified)。

      1
      dnf install <package_name>
    • Pacman:用于 Arch Linux。也是我最喜欢的桌面版 Linux。

      1
      pacman -S <package_name>

    顺便一提,macOS 上也有包管理器 Homebrew。

    1
    brew install <package_name>
  2. 编译源代码

    这需要下载源代码并手动编译。通常下载一个压缩包,解包后进入目录,建议先读一下README之类的说明文件。常见的编译工具包括makegcccmake。这个过程可以提供更多的灵活性,但通常更复杂一些。后文详细介绍。

  3. 二进制

    下载预编译的二进制文件,然后手动安装。这通常涉及将文件复制到适当的位置,并进行一些配置,例如将包含可执行的主程序文件所在目录添加进PATH环境变量。

此外还有容器化技术(Docker)等,在此不表。

概念间联系

GCC

GCC 全称是 GNU Compiler Collection,是一个编译套件。我们可以通过 gcc/g++ 来编译目标项目。但是当项目结构复杂时,通过 gcc/g++ 命令直接编译会出现非常多不便之处,于是出现了Makefile

Makefile

Makefile文本文件来描述项目的构建规则和依赖关系,其中包含了一系列的规则(有条理的 gcc/g++ 编译命令),每个规则指定了如何编译和链接项目中的文件。这样就不需要在终端输入 gcc/g++ 命令来编译项目了。

Make

Make 是一个编译工具。简单地说,Make 工具就是“读取”并执行Makefile文件中的编译指令,从而进行项目编译。

CMakeLists

对于小型项目或者具有简单编译规则的项目,可以手动编写Makefile。当项目非常庞大时,手写Makefile就是一件非常恐怖的事情了。这时候就有 CMakeLists 来拯救开发者了。可以通过CMakeLists.txt文本文件,使用更简单的写法,来交给 CMake 生成对应的Makefile文件。

CMake

CMake 是一个编译配置工具。CMake使用CMakeLists.txt文件来描述项目的结构和依赖关系,然后根据这个文件生成适合于目标编译系统的Makefile或项目文件。

./configure 或 Autotools

部分项目使用configure可执行脚本文件(而非通过CMakeLists.txt使用cmake)来生成Makefile./configure 命令使用 GNU Autotools 工具。与 CMake 类似,Autotools 也是一个编译配置工具。可以简单地理解为 Autotools 的./configure命令与 CMake 的cmake ..命令是同级的,开发者可以根据项目需求和个人偏好选择其中之一。近年来,CMake 有取代 Autotools 的趋势。

编译安装过程

编写程序的主要步骤有

  1. Edit: 使用编辑器编写源代码,如.c.cc.cpp等文件。
  2. Compile: 使用编译器编译源代码生成目标文件,如.o.a(Linux 静态库),.so(Linux 共享库)等文件。
  3. Link: 使用链接器链接目标代码生成可执行文件,如.exe(Windows),.out(Unix)等文件。

编译和安装软件的一般步骤如下:

1
2
3
4
5
mkdir build
cd build
cmake ..
make
sudo make install

前两步不难理解,就是创建一个build子目录,并把对应项目的编译文件放在其中。这样,编译过程会在这个单独的目录中进行,以防止源代码和生成的文件混淆。

第3步cmake ..命令告诉 CMake 在上级目录中查找CMakeLists.txt文件,并由此生成Makefile

或者在 Autotools 的项目中,以上步骤使用./configure

第4步make用来执行实际的编译步骤,根据Makefile文件中的规则编译和链接源代码,生成可执行文件或库。

第5步make install会将编译生成的文件安装到系统目录中,以便在系统中全局使用该软件。这通常包括可执行文件、库文件和其他必要的资源。比如从 github 下载一个依赖库的安装包,解压后经过上面几步,该依赖库的对应头文件和库文件就安装到系统中了。

参考

make、cmake、make install、configure_ustbming的博客-CSDN博客
GCC、Make、CMake、Makefile、CMakelists的关系 - 简书
软件开发|抛弃 Autotools 向 CMake 迈进吧

本文作者:liyijie

本文链接:https://liyijie.cn/2023/make-install/

文章默认以 署名-非商业性使用-相同方式共享 授权。