cmake学习1:基本的CMakeLists的编写

2023-05-16

前言: 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法,有时候出现找不到第三方库的问题也不知如何排查,因此相对cmake有个稍微系统的认识,希望能用这个强大的工具来更好的为自己的工程服务,因此总结为了几篇博客,主要参考的是官网的Tutorial,加入了自己的认识,另外,其实cmake本质上是一个工具,工具的作用就是用来帮助我们更好的构建项目的,所以对于工具能够满足使用要求就好,不必细枝末节的完全掌握,如有错误请斧正.

测试cmake版本:3.20.4

测试平台:ubuntu16.04

Tutorial源代码:https://github.com/FreddyName/cmake_tutorialshttps://github.com/FreddyName/cmake_tutorials

系列博客目录:

cmake学习1: 基本的CMakeLists.txt的编写https://blog.csdn.net/Heart_M/article/details/120626697

cmake学习2: 如何将源代码编译成库并使用https://blog.csdn.net/Heart_M/article/details/120632708

cmake学习3: 如何安装自己的工程在本地icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120640741

cmake学习4: 如何将自己的工程打包给别人icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120641933

cmake学习5: 如何将自己的库作为第三方库给别人使用icon-default.png?t=L892https://blog.csdn.net/Heart_M/article/details/120643023


  • 基本操作

最基本的项目就是通过一个.cpp源文件构建而成的可执行文件,对于此简单项目,CMakeLists.txt只需要三行内容(CMakeLists.txt与tutorial.cxx在同级目录):

#required cmake minimum version 
cmake_minimum_required(VERSION 3.10)

# set the project name
project(Tutorial)

# add the executable
add_executable(Tutorial tutorial.cxx)

注意: cmake对于大写或者小写或者大小写混合都是兼容的.

上面的三行命令分别制定了cmake的最小版本需求, 将project命名为Tutorial,将tutorial.cxx编译为名为Tutorial的可执行文件(tutorial.cxx在这里实现的是对一个符合条件的数进行平方根运算,只依赖于c++的基本库,因此无需链接其他库)

tutorial.cxx内容如下:

#include <cmath>
#include <cstdlib>
#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
  if (argc < 2) {
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }

  // convert input to double
  const double inputValue = atof(argv[1]);

  // calculate square root
  const double outputValue = sqrt(inputValue);
  std::cout << "The square root of " << inputValue << " is " << outputValue
            << std::endl;
  return 0;
}

在step1文件夹同级下构建build_Step1文件夹并编译:

mkdir build_Step1
cd build_Step1
cmake ../Step1
cmake --build .

然后在build_Step1文件夹中生成Tutorial可执行文件, 验证

  • 增加版本号和配置头文件

接下来我们希望为我们的工程指定一个版本号,因为如果我们自己实现一个库的时候肯定是有版本的,比如说opencv 3.4.3版本等,我们是可以在源码中进行操作的,不过在CMakeLists.txt中操作更加的灵活. 这个主要涉及到如何将CMakeLists.txt中的版本信息传递到其他文件中,操作步骤如下:

在project(Tutorial)中指定版本号

project(Tutorial VERSION 1.0)

配置一个头文件将CMakeLists.txt中的版本号传到源代码: 新建一个TutorialConfig.h.in文件, 写入如下内容:

#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

然后在CMakeLists.txt中配置:

configure_file(TutorialConfig.h.in TutorialConfig.h)

这里说明一下configure_file的作用: 

configure_file,复制一份输入文件到输出文件,替换输入文件中被@VAR@或者${VAR}引用的变量值。也就是说,让普通文件,也能使用CMake中的变量

例如:我们在CMakeLists.txt中指定了project的版本号, 那么Tutorial_VERSION_MAJOR和Tutorial_VERSION_MINOR就是1和0,在生成的TutorialConfig.h文件中就变成了


#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0  

然后在源码中就可以使用这两个变量的值了(前提是include TutorialConfig.h)生成的TutorialConfig.h文件就在build_Step1目录下

 这个时候配置文件要被写入到二进制文件中,因此需要在CMakeLists.txt中包含这个路径:

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

这里说一下include_directories与target_include_directories的区别:

include_directories(x/y) 影响的是所有构建的target的路径范围, 使用这个命令指定,所有的target都包含了这个路径.

target_include_directories(t x/y)仅仅是影响t的路径范围,对于其他的target的include路径并不影响, 支持PRIVATE PUBLIC INTERFACE三个属性

然后就可以在源码中获得版本号了

#include <TutorialConfig.h>

if (argc < 2) {
    // report version
    std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
              << Tutorial_VERSION_MINOR << std::endl;
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }
  •  指定具体的c++标准

如果使用c++11标准, 那么需要在CMakeLists.txt中显示指定

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake学习1:基本的CMakeLists的编写 的相关文章

随机推荐

  • 初识ROS文件结构:以阿木实验室Prometheus项目为例

    ROS的工作空间是一个存放工程开发相关文件的文件夹 xff0c Fuerte版本之后的ROS默认使用的是Catkin编译系统 功能包是ROS软件中的基本单元 xff0c 包含ROS节点 库 配置文件等 一个文件夹是功能包的标志是该文件夹中有
  • 六轴无人机装配问题小结(Pixhawk飞控、APM固件、电机装配、电调校准)

    笔者近期需要组装一架六轴无人机供超声波避障模块 单点激光雷达等传感器的测试使用 由于是第一次碰真机 xff0c 面对散落一箱的部件还是非常的头大的 xff0c 不过好在实验室有经验的大佬能提供一些指导 xff0c 并且还能够参考 创客智造
  • 测试API接口,返回404。

    报错 xff1a 34 timestamp 34 34 2020 06 02T12 40 53 125 43 00 00 34 34 status 34 404 34 error 34 34 Not Found 34 34 message
  • 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结

    转自 xff1a http blog csdn net flydream0 article details 52317532 1 前言 bxCAN是STM32系列最稳定的IP核之一 xff0c 无论有哪个新型号出来 xff0c 这个IP核基
  • NVIDIA TX2自制底板的USB口无法使用的一种解决方法

    这是由于官方的底板上采用INA3221芯片做了电源监控电路 xff0c 只有确保5V电源达到要求的情况下才会使能USB口 而自制的底板上将上述电路省略了 xff0c 所以导致了USB口无法使用 解决办法就是要给TX2更新设备树 在网上找到一
  • Benchmark(基准测试)初相识

    一 benchmark概念 在计算中 xff0c 基准是运行一个计算机程序 一组程序或其他操作的行为 xff0c 以评估一个对象的相对性能 xff0c 通常是通过对它运行一些标准测试和试验 基准测试一词也通常用于精心设计的基准测试程序本身
  • 嵌入式中的通讯协议——UART、I2C、SPI、DMA

    目录 一 通讯的基本概念 二 USART 串口通讯 三 I2C通讯协议 四 SPI通讯协议 五 DMA 直接存储器存取 六 USART I2C SPI比较 一 通讯的基本概念 1 串行通讯与并行通讯 xff08 按数据的传送方式 xff09
  • RISC与CISC比较

    RISC的设计重点在于降低由硬件执行指令的复杂度 xff0c 因为软件比硬件容易提供更大的灵活性和更高的智能 xff0c 因此RISC设计对编译器有更高的要求 xff1b CISC的设计则更侧重于硬件执行指令的功能 xff0c 使CISC的
  • 操作系统选择调度方式和算法的若干准则

    1 调度的类型 按调度的层次 xff1a 长期 xff08 长程 作业 高级 xff09 调度 xff1b 中期 xff08 中级 中程 xff09 调度 xff1b 短期 xff08 短程 进程 低级 xff09 调度 按OS 的类型 x
  • 提灯过桥问题

    题目 xff1a 小明一家过一座桥 xff0c 过桥时是黑夜 xff0c 所以必须有灯 现在小明过桥要1秒 xff0c 小明的弟弟要3秒 xff0c 小明的爸爸要6秒 xff0c 小明的妈妈要8秒 xff0c 小明的爷爷要12秒 每次此桥最
  • 如何判断一个整数数组中是否有重复元素

    题目 xff1a 写一个函数判断一个int类型的数组是否是有效的 所谓有效是指 xff1a 假设数组大小为n xff0c 那么这个int数组里的值为0 n 1之间的数 xff0c 并且每个数只能出现一次 xff0c 否则就是无效数组 例如
  • C++发送HTTP请求---亲测可行

    转自 xff1a http hi baidu com benbearlove item 1671c23017575825b3c0c53f 环境 xp sp3 vs2008 vs2010在静态库中使用 MFC include lt afxwi
  • 百度2014开发测试工程师笔试题(沈阳站)

    时间 xff1a 2013 9 21 地点 xff1a 沈阳 职位 xff1a 开发测试工程师
  • 2014百度校招开发测试工程师笔试题

    时间 xff1a 2013 9 28 地点 xff1a 深圳 职位 xff1a 开发测试工程师
  • 整体了解HADOOP框架及一些开源项目

    Hadoop框架中 xff0c 有很多优秀的工具 xff0c 帮助我们解决工作中的问题 Hadoop的位置 从上图可以看出 xff0c 越往右 xff0c 实时性越高 xff0c 越往上 xff0c 涉及到算法等越多 越往上 xff0c 越
  • Kafka简介

    Kafka简介 在当前的大数据时代 xff0c 第一个挑战是海量数据的收集 xff0c 另一个就是这些数据的分析 数据分析的类型通常有用户行为数据 应用性能跟踪数据 活动数据日志 事件消息等 消息发布机制用于连接各种应用并在它们之间路由消息
  • Flume入门笔记------架构以及应用介绍

    在具体介绍本文内容之前 xff0c 先给大家看一下Hadoop业务的整体开发流程 xff1a 从Hadoop的业务开发流程图中可以看出 xff0c 在大数据的业务处理过程中 xff0c 对于数据的采集是十分重要的一步 xff0c 也是不可避
  • 分布式服务框架dubbo原理解析

    alibaba有好几个分布式框架 xff0c 主要有 xff1a 进行远程调用 类似于RMI的这种远程调用 的 dubbo hsf xff0c jms消息服务 napoli notify xff0c KV数据库 tair 等 这个框架 工具
  • Linux下安装ElasticSearch

    Linux下安装ElasticSearch 一 下载 amp 安装二 安装中遇到的问题及解决方案三 使用中遇到的问题及解决方案四 安装head五 安装kibana 一 下载 amp 安装 先安装JDK 下载elasticsearch 7 0
  • cmake学习1:基本的CMakeLists的编写

    前言 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法 有时候出现找不到第三方库的问题也不知如何排查 因此相对cmake有个稍微系统的认识 希望能用这个强大的工具来更好的为自己的工程服务 因此总结为了几篇博客 主要参考