Cmake教程之一(入门Cmake基础命令)

2024-08-30 02:52

本文主要是介绍Cmake教程之一(入门Cmake基础命令),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CMake 教程 - 一、快速上手

注:此教程需要了解编译常识和C/C++语法,旨在入门cmake,配置环境工作不在教程范围内

介绍

这一步介绍了CMake的基本语法、命令和变量,完成一个简单的CMake项目。

练习 1: 构建一个基本项目

在一个目录下新建Step1目录
在该新建目录中新建tutorial.cxx(其实就是c++文件)
复制粘贴下面的内容:

// tutorial.cxx#include <cmath>
#include <iostream>
#include <string>
#include "TutorialConfig.h"
// 定义版本信息
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0int main(int argc, char *argv[])
{if (argc < 2){// report versionstd::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."<< Tutorial_VERSION_MINOR << std::endl;std::cout << "Usage: " << argv[0] << " number" << std::endl;return 1;}// 将输入字符串转换为doubleconst double inputValue = std::stod(argv[1]);// 计算平方根const double outputValue = std::sqrt(inputValue);// 输出结果std::cout << "The square root of " << inputValue << " is " << outputValue << std::endl;return 0;
}

最基本的CMake项目是从一个单一的源文件构建一个可执行文件,做到这样至少需要三个CMake命令:

步骤

  1. 指定CMake版本,确保cmake兼容性
    cmake_minimum_required(VERSION 3.10)
    
  2. 设置项目名称,有一些变量会与项目名称挂钩
    project(Tutorial)
    
  3. 添加可执行文件,最起码输出的可执行文件得知道是啥
    add_executable(Tutorial tutorial.cxx)
    

构建和运行

  • 创建构建目录(新建文件夹:
    mkdir Step1_build
    
  • 进入构建目录并配置项目(让cmake根据CMakeLists自动生成编译的步骤和实现:
    cd Step1_build
    cmake ../Step1
    
  • 构建项目,根据cmake生成的编译步骤编译:
    cmake --build .
    
  • 运行可执行文件:
    ./Tutorial 10
    

由上可以看出,cmake的作用是隔离平台的不同,通过一个CMakeLists生成在不同的平台的编译过程并可以通过cmake命令执行

练习 2: 指定C++标准

在这个练习中,学习如何指定一个特定的C++标准,如C++11。

步骤

  1. tutorial.cxx 中用 std::stod 替换 atof
    const double inputValue = std::stod(argv[1]);
    
  2. 移除不必要的 #include 指令
    // 移除: #include <cstdlib>
    
  3. CMakeLists.txt 中指定C++11标准
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    

构建和运行

  • 重新进入构建目录并构建项目:
    cd Step1_build
    cmake --build .
    
  • 运行可执行文件:
    ./Tutorial 10
    

练习 3: 添加版本号和配置头文件

有时我们希望在源代码中使用在 CMakeLists.txt 中定义的变量。在这个练习中,我们将添加一个项目的版本号并打印出来。

步骤

  1. CMakeLists.txt 中定义项目版本号
    project(Tutorial VERSION 1.0)
    
  2. 使用 configure_file 命令创建配置文件
    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/TutorialConfig.h.in""${CMAKE_CURRENT_BINARY_DIR}/TutorialConfig.h"
    )
    官方CMake教程对configure_file的解释是:复制一份输入文件到输出文件,替换输入文件中被@VAR@或者${VAR}引用的变量值。也就是说,让普通文件,也能使用CMake中的变量。
    
  3. CMakeLists.txt 中指定包含路径
    target_include_directories(Tutorial PUBLIC"${CMAKE_CURRENT_BINARY_DIR}")
    # 通过打印头文件信息,可以看到包含目录的添加结果
    get_target_property(INCLUDE_DIRS Tutorial INCLUDE_DIRECTORIES)
    message(STATUS "Include directories for Tutorial: ${INCLUDE_DIRS}")
    
  4. tutorial.cxx 中包含配置头文件
    #include "TutorialConfig.h"
    
  5. 打印版本号
    # 可以读取到构建目录下头文件中替换后的变量值
    std::cout << "Tutorial Version " << Tutorial_VERSION_MAJOR << "."<< Tutorial_VERSION_MINOR << std::endl;
    

构建和运行

  • 重新构建项目并运行:
    cd Step1_build
    cmake --build .
    ./Tutorial
    

此时可以看到程序输出项目的版本号。

这篇关于Cmake教程之一(入门Cmake基础命令)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119594

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务