作者:手机用户2602883245 | 来源:互联网 | 2023-08-28 11:14
GNUMake用于控制如何从程序的源代码文件编译并链接为可执行文件,通过make命令从名称为makefile的文件中获取构建信息,该文件定义了一系列规则来指定源文件的编译先后顺序、
GNU Make 用于控制如何从程序的源代码文件编译并链接为可执行文件,通过 make
命令从名称为 makefile
的文件中获取构建信息,该文件定义了一系列规则来指定源文件的编译先后顺序、是否需要重新编译、甚至于进行更为复杂的操作。通过 makefile
文件可以方便的实现工程的自动化编译,只需要执行 make
命令即可完成编译动作,从而极大的提高了开发人员的工作效率。
CMake 3.17 是一款源代码构建管理工具,最初作为各种 Makefile 方言的生成器,后来逐步发展为现代化的构建系统,广泛用于 C 和 C++ 工程源代码的构建。官方提供的 《CMake Tutorial》 为开发人员提供了一个循序渐进的指南,涵盖了 CMake 构建过程中常见问题的解决方案。如果需要构建从第三方发布的源代码包,则可以参考 《User Interaction Guide》 。而 《Using Dependencies Guide》 则主要针对需要使用第三方库的开发人员。
GNU Make
make
是一款用于解释 makefile
文件当中命令的工具,而 makefile
关系到整个工程的编译规则。许多 IDE 集成开发环境都整合了该命令,例如:Visual C++ 里的 nmake ,Linux 里的 GNU make ,本章节主要讲解 GNU make 相关的内容。开始进一步讲解之前,需要先了解一下 C/C++ 源代码的编译过程,具体内容可参见笔者的 《基于 Linux 的 GCC 与 GDB 应用调试》 - 编译步骤 一文:
- 预处理 Preprocessing :解析各种预处理命令,包括头文件包含、宏定义的扩展、条件编译的选择等;
- 编译 Compiling :对预处理之后的源文件进行翻译转换,产生由机器语言描述的汇编文件;
- 汇编 Assembly :将汇编代码转译成为机器码;
- 链接 Link :将机器码中的各种符号引用与定义转换为可执行文件内的相应信息(例如虚拟地址);
Autoconf
autoconf
Automake
automake
CMake
CMake 教程提供了一个循序渐进的指南,涵盖了常见的构建系统问题。本文涉及的示例代码可以在 CMake 源码树 的 Help/guide/tutorial
目录下找到,每个步骤都拥有其相应的子目录,循序渐进直至提供完整的解决方案。
基本出发点
最为基础的项目是从源代码构建可执行文件,这样只需要一个 3 行的 CMakeLists.txt
文件,这将是整个教程的起点。在【Step1】目录当中创建如下 CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.10)
# set the project name
project(Tutorial)
# add the executable
add_executable(Tutorial tutorial.cxx)
CMake 支持 大写 、 小写 、 混合大小写 的命令,上面的 CMakeLists.txt
文件使用了小写命令。教程源代码 Step1
目录中提供了用于执行数字平方根计算的 cxx
文件。
/* 用于执行数字平方根计算的简单程序 */
#include
#include
#include
#include
int main(int argc, char* argv[]) {
if (argc <2) {
std::cout <<"Usage: " < return 1;
}
const double inputValue = atof(argv[1]); // 将输入数据转换为 double 类型
const double outputValue = sqrt(inputValue); // 计算平方根
std::cout <<"The square root of " < < return 0;
}
添加版本号和配置头文件
我们要添加的第一个特性是为项目提供 1 个版本号。虽然源代码中也可以完成这件事,但是使用 CMakeLists.txt
可以提供更好的灵活性。首先,修改 CMakeLists.txt
文件,使用 project()
命令设置项目名称和版本号。
cmake_minimum_required(VERSION 3.10)
# 设备项目名和版本号
project(Tutorial VERSION 1.0)
然后,继续编写配置,把一个头文件上保存的版本号传递到源代码:
configure_file(TutorialConfig.h.in TutorialConfig.h)
由于配置文件将会被写入到二叉树,所以必须将该目录添加至搜索包含文件的路径列表当中,在 CMakeLists.txt
文件的末尾添加以下行:
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
在当前目录下创建 TutorialConfig.h
文件,并且包含如下内容:
/* 配置主、副版本号 */
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
当 CMake 配置该头文件以后,上述的 @Tutorial_VERSION_MAJOR@
和 @Tutorial_VERSION_MINOR@
的值将会被替换。
接下来修改 tutorial.cxx
来包含上面的 TutorialConfig.h
头文件,并最终通过修改后的 tutorial.cxx
打印版本号。
#include "TutorialConfig.h"
if (argc <2) {
/* 打印版本号 */
std::cout < < std::cout <<"Usage: " < return 1;
}
指定 C++ 标准
接下来,将 tutorial.cxx
文件中的 atof
替换为 std::stod
,从而为项目添加一些 C++11 特性。同时,删除 #include
。
const double inputValue = std::stod(argv[1]);
CMake 中启用特定 C++ 标准支持的最简单方法是使用 CMAKE_CXX_STANDARD
变量,这里将 CMakeLists.txt
文件里的 CMAKE_CXX_STANDARD
变量设置为 11
,并将 CMAKE_CXX_STANDARD_REQUIRED
设置为 True
:
cmake_minimum_required(VERSION 3.10)
# 设置项目名称与版本
project(Tutorial VERSION 1.0)
# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
编译与测试
从命令行导航到 CMake 源代码树的 Help/guide/tutorial 目录,并运行以下命令:
CMake GUI