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

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.mzph.cn/news/831252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

msmpi 高性能计算实现文件读取输入

【高性能计算】完美解决Windows下安装mpi环境并应用到VSCode中报错问题的方法_c:\program files (x86)\microsoft sdks\mpi\include/-CSDN博客 环境配置 然后跑这个代码测试即可 // 命令行参数&#xff1a; //mpiexec -n 9 "C:\Users\ASUS\Desktop\testMPI\MPIv2.exe&qu…

【氮化镓】GaN器件可靠性及市场前景概述

文章是关于氮化镓&#xff08;GaN&#xff09;场效应晶体管&#xff08;FET&#xff09;技术在空间应用中的可靠性、辐射效应和市场前景的概述。文章由Airbus Defence & Space的多位专家撰写&#xff0c;涵盖了GaN FET技术的多个关键方面&#xff0c;包括技术概述、可靠性问…

Find My无人机|苹果Find My技术与无人机结合,智能防丢,全球定位

无人机是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机&#xff0c;或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域&#xff0c;可分为军用与民用。军用方面&#xff0c;无人机分为侦察机和靶机。民用方面&#xff0c;无人机行业应用&#xff0c;是无…

opencv基础篇 ——(十二)轮廓提取与绘制

opencv基础篇 ——&#xff08;十二&#xff09;轮廓提取与绘制 findContours轮廓提取 void void findContours( InputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset Point());功能介绍 cv::findContours 是 OpenC…

【python】商业数据聚类-回归数据分析可视化(源码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

ios CI/CD 持续集成 组件化专题四-(手动发布私有库-组件化搭建)

一 、创建私有索引库 1.1 、第一步 首先检查本地是否存在需要的私有索引库 pod repo list 例如&#xff1a;dp_base_ios_spec 在本地不存在该私有索引库 1.2 、第二步 在git下下创建一个新的库&#xff0c;这个库用来保存私有库的podspec文件&#xff0c;取名叫xxxSpec用以…

以更多架构核心专利,推进 SDS 产业创新创造

今天是第 24 个世界知识产权日&#xff0c;今年世界知识产权日活动的主题是&#xff1a;“知识产权和可持续发展目标&#xff1a;立足创新创造&#xff0c;构建共同未来。” 这也正是 XSKY 在软件定义存储领域的目标之一。以“数据常青”为使命的 XSKY&#xff0c;始终立足于软…

【MySQL | 第十篇】重新认识MySQL索引匹配过程

文章目录 10.重新认识MySQL索引匹配过程10.1匹配规则10.2举例&#xff1a;联合索引遇到范围查询&#xff08;>、<、between、like&#xff09;10.2.1例子一&#xff1a;>10.2.2例子二&#xff1a;>10.2.3例子三&#xff1a;between10.2.4例子四&#xff1a;like 10…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作&#xff0c;今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作&#xff0c;有助于更换理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

探索AIGC技术:创新、挑战与责任

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 #如何看待AIGC技术&#xff1f; 目录 AIGC简单介绍 创新 责任 未来展望和挑战 AIGC简单介绍 A…

【Linux系统】守护进程

一.进程组&#xff0c;会话 PGID&#xff1a;进程组id&#xff0c;一条命令启动的所有进程及其子进程属于同一个进程组。一条指令中最先创建的进程就是组长&#xff0c;组id就是组长的PID。./启动的SID&#xff1a;会话id&#xff0c;每次登录Linux&#xff0c;操作系统给登录的…

vue2(4)之scoped解决样式冲突/组件通信/非父子通信/ref和$refs/异步更新/.sync/事件总线/provide和inject

vue2 一、学习目标1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09;2.组件通信3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09;4.进阶语法 二、scoped解决样式冲突**1.默认情况**&#xff1a;2.代码演示3.scoped原理4.总结 三、data必须是一个函数…

C语言-调试技巧

目录 一、调试介绍1.1 Debug和Release的介绍1.2 Windows环境调试介绍1.2.1 学会快捷键1.2.2 查看临时变量的值1.2.3 查看内存信息1.2.4 查看调用堆栈1.2.4 查看汇编信息1.2.5 查看寄存器信息 二、编程常见的错误2.1 编译型错误2.2 链接型错误2.3 运行时错误 三、易于调试的代码…

Redis---------实现更改数据业务包括缓存更新,缓存穿透雪崩击穿的处理

三种更新策略 内存淘汰是Redis内存的自动操作&#xff0c;当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire)&#xff0c;有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新&#xff0c;所以接下来研究主动更新策略。 主动更新策略…

配置 Trunk,实现相同VLAN的跨交换机通信

1.实验环境 公司的员工人数已达到 100 人&#xff0c;其网络设备如图所示。现在的网络环境导致广播较多网速慢&#xff0c;并且也不安全。公司希望按照部门划分网络&#xff0c;并且能够保证一定的网络安全性。 其网络规划如下。 PC1和 PC3为财务部&#xff0c;属于VLAN 2&…

npm详解:Node.js包管理器的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Ubuntu系统安装nvfortran详细步骤【笔记】

实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; Ubuntu系统安装NVFORTRAN&#xff08;NVIDIA Fortran Compiler&#xff09;步骤如下&#xff1a; 安装依赖项&#xff1a;在安装NVFORTRAN之前&#xff0c;你需要确保系统已经安装了一些必要…

MyBatis-plus笔记——条件构造器和常用接口

wapper介绍 Wapper&#xff1a;条件构造抽象类 AbstractWapper&#xff1a;用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper&#xff1a;查询条件封装UpdateWrapper&#xff1a;Update 条件封装AbstractLambdaWrapper&#xff1a;使用Lambda语法 LambdaQuery…

IDEA启动项目报错:Error running ‘‘: Command line is too long.

1、在workspace.xml 2、 在标签 <component name"PropertiesComponent"> 添加 <property name"dynamic.classpath" value"true" />