CMake:set与list的字符串操作(六)

devtools/2024/9/26 1:24:33/
1、变量操作

有时候项目中的源文件并不一定都在同一个目录中,但是这些源文件最终却需要一起进行编译来生成最终的可执行文件或者库文件。如果我们通过file命令对这个目录下的源文件进行搜索,最后还需要做一个字符串拼接的操作,关于字符串拼接可以使用set命令也可以使用list命令。

  • 无论是set还是list命令,内部底层处理都是使用;进行值的分割
1.1、set拼接

set进行字符串拼接,对应的命令格式如下:

#set(变量名1 ${变量名1} ${变量名2} ...)
set(src1 ${src1} ${src2})

关于上面的命令其实就是将从第二个参数开始往后所有的字符串进行拼接,最后将结果存储到第一个参数中,如果第一个参数中有数据就会对元数据进行覆盖

cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 14)
project(test)set(tmp "hello, world!")
file(GLOB src1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
aux_source_directory(${PROJECT_SOURCE_DIR}/src2 src2)
set(src ${tmp} ${src1} ${src2})message(STATUS "result: ${src}")# 输出如下:
-- result: hello, world!;~/v2/src1/add.cpp;~/v2/src1/dived.cpp;~/v2/src1/mul.cpp;~/v2/src1/sub.cpp;~/v2/src2/main.cpp
1.2、list拼接

如果使用list进行字符串拼接,对应的命令格式如下:

#list(APPEND <list> [<element> ...])
list(APPEND)

list命令功能比set要强大,字符串拼接只是它的其中一个功能,所以需在在它第一个参数的位置指定出外面要做的操作,APPEND表示进行数据追加,后面的参数就和set一样了。

cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 14)
project(test)list(APPEND tmp "hello, world!")
file(GLOB src1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
aux_source_directory(${PROJECT_SOURCE_DIR}/src2 src2)
list(APPEND tmp ${tmp} ${src1} ${src2})message(STATUS "result: ${tmp}")# 输出如下:
-- result: hello, world!;hello, world!;~/v2/src1/add.cpp;~/v2/src1/dived.cpp;~/v2/src1/mul.cpp;~/v2/src1/sub.cpp;~/v2/src2/main.cpp
1.3、移除

当通过使用file搜索某个目录就得到该目录下所有的源文件,但是其中有些源文件并不是我们所需要的,比如:制作库需要移除main.cpp文件

├── src
│   ├── add.cpp
│   ├── dived.cpp
│   ├── main.cpp
│   ├── mul.cpp
│   └── sub.cpp

在当前目录中有5个源文件,其中main.cpp是一个主程序文件,如果不想把它和其他方法源文件一起生成一个动态库给别人使用时那么就需要add.cpp、dived.cpp、mul.cpp、sub.cpp这四个源文件就可以,此时就需要将main.cpp从搜索到的数据中剔除出去,要想实现移除的功能可以使用list

# list(REMOVE_ITEM <list> [<value> ...])cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 14)
project(test)list(APPEND tmp "hello, world!" "CMake Test")
aux_source_directory(${PROJECT_SOURCE_DIR}/src src)
list(APPEND tmp ${src})
message(STATUS "result: ${tmp}")list(REMOVE_ITEM tmp "CMake Test" "${PROJECT_SOURCE_DIR}/src/main.cpp")
message(STATUS "result: ${tmp}")# 输出结果:
-- result: hello, world!;CMake Test;~/v2/src/add.cpp;~/v2/src/dived.cpp;~/v2/src/main.cpp;~/v2/src/mul.cpp;~/v2/src/sub.cpp-- result: hello, world!;~/v2/src/add.cpp;~/v2/src/dived.cpp;~/v2/src/mul.cpp;~/v2/src/sub.cpp
2、list其他操作
  • 获取list的长度

    list(LENGTH <list> <output_variable>)
    
    • LENGTH:子命令LENGTH用于读取列表长度
    • <list>:当前操作的列表
    • <output_variable>:新创建的变量,用户存储列表长度的结果
  • 读取列表中指定碎银的元素,可以指定多个索引

    list(GET <list> [<element_index>....] <output_variable>)
    
    • <list>:当前操作的列表

    • <element_index>:列表元素的索引

      • 从开始编号,索引表示0的元素为列表中的第一个元素
      • 索引也可以是负数,-1表示列表的最后一个元素,-2表示倒数第二个元素,以此类推
      • 当索引(不管正负)超过列表的长度,运行会报错
    • <output_variable>:新创建的变量,用户存储索引元素的返回结果,也是一个列表

  • 将列表中的元素用连接符(字符串)连接起来组成一个字符串

    list(JOIN <list> <glue> <output_variable>)
    
    • JOIN:子命令JOIN用于连接列表数据
    • <list>:当前操作的列表
    • <glue>:指定的链接符(字符串)
    • <output_variable>:新创建的变量,存储返回的字符串
  • 查找list列表中是否存在指定的元素, 若未找到返回-1

    list(FIND <list> <value> <output_variable>)
    
    • FIND:表示进行查找操作
    • <list>:表示当前操作的列表
    • <value>:需要在列表中搜索的元素
    • <output_variable>:新创建的变量
      • 如果列表<list>中存在<value>那么返回<value>在列表中的索引
      • 如果未找到则返回-1
  • 将元素追加到列表尾部中

    list(APPEND <list> [<element> ...])
    
  • 将元素插入到列表的0索引位置

    list(PREPEND <list> [<element> ...])
    
  • 将列表中的最后元素移除

    list(POP_BACK <list> [<output_variable> ...])
    
  • 将列表中的第一个元素移除

    list(POP_FRONT <list> [<output_variable> ...])
    
  • 将指定元素从列表中移除

    list(REMOVE_ITEM <list> [<value> ...])
    
  • 将指定索引的元素从列表中移除

    list(REMOVE_AT <list> [<index> ...])
    
  • 移除列表中重复的元素

    list(REMOVE_DUPLICATES <list>)
    
  • 列表翻转

    list(REVERSE <list>)
    
  • 列表排序

    list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
    
    • COMPARE:指定排序方法。有如下几种值可选:
      • STRING:按照字符顺序进行排序,为默认的排序方法
      • FILE_BASENAME:如果是一系列路径名,会使用basename进行排序
      • NATURAL:使用自然数顺序排序
    • CASE:指明大小写是否敏感,有如下两种值可选:
      • SENSITIVE:按照大小写敏感的方式进行排序,为默认值
      • INSENSITIVE:按照大小写不敏感方式进行排序
    • ORDER:指明排序的顺序,如有几种值可选
      • ASCENDING:按照升序排列,为默认值
      • DESCENDING:按照降序排列

还有很多没有展示出来的命令,具体的可以看官网;也不知道有什么用,先写个笔记用到再说~


http://www.ppmy.cn/devtools/29822.html

相关文章

OpenCV 笔记(31):图像锐化算法——拉普拉斯锐化和 USM 锐化

1. 图像锐化和增强 图像锐化是一种突出和加强图像中景物的边缘和轮廓的技术&#xff0c;使图像变得更加清晰。它通过增强图像的高频分量来减少图像中的模糊&#xff0c;增强图像细节边缘和轮廓&#xff0c;增强灰度反差&#xff0c;便于后期对目标的识别和处理。 图像增强是改…

SpringCloud特殊问题处理1——通过Feign传递List类型参数

在微服务项目的开发过程中&#xff0c;远程数据接口调用是必需的操作。其中绝大部分的接口写法和用法与api相似&#xff0c;但是对于List<Obj>这种对象的参数使用需要异常关注。 1.List<Obj>对象集合参数传递 注意&#xff1a; Feign接口不能直接使用List<Ob…

MATLAB : interp1()用法介绍

目录 一、基本语法&#xff1a; 二、实例&#xff1a; 1.样条拟合减振器阻尼曲线 ​2.PP拟合时间温度曲线 interp1 是 MATLAB 中的一个函数&#xff0c;用于在一维数据上执行插值操作。这个函数可以帮助你估计或计算已知数据点之间未知点的值。以下是 interp1 函数的基本用…

【Vue】监听div宽高的变化(动态渲染echarts宽高)

一、问题 echarts 未监听到 echarts 宽高变化而动态变化 <template> <div id"echart" ref"echart" style"width: 100%; height: 300px"></div> </div> </template> <script> export default { data() {…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

作者&#xff1a;余凯 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的IaaS化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度&#xff0c;也一直在高速的发展和演…

Go 泛型函数中的 ~ 符号 的意义 -- 用于指定类型的底层类型

本文通过 slices.Clone 泛型函数介绍了 Go 是如何使用类型推断完成参数类型的解构。简单来说&#xff0c;如果第一个类型参数是一个复合类型&#xff0c;则可以通过第二、第三或更多的类型参数约束复杂类型中的类型参数&#xff0c;而类型推断则可以通过第一个参数推断出后续类…

【面试经典 150 | 分治】合并 K 个升序链表

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;顺序合并方法二&#xff1a;分治合并方法三&#xff1a;使用优先队列合并 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目…

【项目经验】Redis Sentinel从工程中下线并对业务迁移-(二)

在上篇文章【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中-CSDN博客有说到迁移的计划。最近一直按照计划进行迁移&#xff0c;期间遇到了不少问题。总结如下&#xff1a; 一、key未设置过期时间 redis基于内存存储&#xff0c;主要作用是缓存。当大量的key未设置…