热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从GNUMake到CMake快速入门

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 应用调试》 - 编译步骤 一文:




  1. 预处理 Preprocessing :解析各种预处理命令,包括头文件包含、宏定义的扩展、条件编译的选择等;

  2. 编译 Compiling :对预处理之后的源文件进行翻译转换,产生由机器语言描述的汇编文件;

  3. 汇编 Assembly :将汇编代码转译成为机器码;

  4. 链接 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




推荐阅读
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • iOS开发中常用的设备标识符(IDFA、IDFV、MAC地址、UDID、openUDID)及其应用场景
    在iOS开发过程中,了解并合理使用各种设备标识符对于数据统计和用户分析至关重要。本文详细介绍了几种常用的设备标识符及其应用场景:IDFA(广告标识符)用于广告追踪和归因;IDFV(供应商标识符)适用于同一应用或同一开发者旗下的应用内识别用户;MAC地址和UDID(唯一设备标识符)虽然已被弃用,但在某些历史场景下仍有参考价值;而openUDID作为一种开源解决方案,提供了一种替代UDID的方法。这些标识符各有特点,开发者应根据具体需求选择合适的标识符。 ... [详细]
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 教程:使用Source Monitor进行代码质量分析
    Source Monitor 是一款强大的代码分析工具,能够对 Java、C++、C、C# 和 Delphi 等多种编程语言进行复杂度分析,帮助开发者有效评估和提升代码质量。通过详细的指标和报告,该工具可辅助团队识别潜在问题并优化代码结构。 ... [详细]
  • C/C++利用栈和队列实现停车场管理系统【C++教程】
    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要 ... [详细]
  • 欢迎来到Netgen新时代:探索网络生成技术的无限可能
    欢迎进入Netgen的新时代:探索网络生成技术的无限潜力。本文将详细介绍如何编译下载的Netgen源代码,生成Netgen程序,并提供开发所需的库nglib。此外,还将探讨Netgen在现代网络设计与仿真中的应用前景,以及其在提高网络性能和可靠性方面的关键作用。 ... [详细]
  • 在编写数据库应用程序时,常常需要用户自己在控制面板中配置ODBC数据源。然而对一般用户而言,配置ODBC数据源的工作是有一定困难的。因此, ... [详细]
author-avatar
手机用户2602883245
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有