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

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放