在数据库系统课程的实验使用 MiniOB,首先需要搭建环境进行编译和调试。正好借此机会梳理一下编译安装的过程和要点,留作笔记。
从几种安装方式说起,再具体讨论一下编译安装,以及 GCC、Make、CMake、Makefile、CMakeLists 的关系。
Linux软件安装方式
包管理器(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>
编译源代码
这需要下载源代码并手动编译。通常下载一个压缩包,解包后进入目录,建议先读一下
README
之类的说明文件。常见的编译工具包括make
、gcc
和cmake
。这个过程可以提供更多的灵活性,但通常更复杂一些。后文详细介绍。二进制
下载预编译的二进制文件,然后手动安装。这通常涉及将文件复制到适当的位置,并进行一些配置,例如将包含可执行的主程序文件所在目录添加进
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 的趋势。
编译安装过程
编写程序的主要步骤有
- Edit: 使用编辑器编写源代码,如
.c
,.cc
,.cpp
等文件。 - Compile: 使用编译器编译源代码生成目标文件,如
.o
,.a
(Linux 静态库),.so
(Linux 共享库)等文件。 - Link: 使用链接器链接目标代码生成可执行文件,如
.exe
(Windows),.out
(Unix)等文件。
编译和安装软件的一般步骤如下:
1 | mkdir build |
前两步不难理解,就是创建一个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 迈进吧