CMakeList项目构建

CMakeList项目构建


OVERVIEW

  • CMakeList项目构建
      • cmake
      • 1.变量定义
      • 2.指定源文件路径
      • 3.指定头文件路径
      • 4.字符串操作
      • 5.日志打印
      • 6.预定义宏

cmake、makefile都是项目构建工具,通过make命令进行项目构建,大多的IDE都集成了make项目构建,如visual studio的nmake、linux下的GUN make、Qt的qmake,但是makefile通常非常依赖于当前的编译平台,而且编写makefile的工作量较大,解决依赖关系时也容易出现错误,

CMake允许开发者指定整个工程的编译流程,再根据编译平台自动生成本地化Makefile和工程文件,最后用户只需输入make进行编译即可(自动生成makefile的工具),编译流程如下:

在这里插入图片描述

补充:可以为cmake编写特定功能模块,扩充cmake功能,

cmake

cmake支持大小写的混合的命令,

  1. cmake_minimum_required:指定使用的 cmake 的最低版本,

  2. project:定义工程名称,指定工程版本、工程描述、web主页地址、支持的语言(默认支持所有语言),如不需要都可忽略只给出工程名称,

  3. add_executable(可执行程序名 源文件名称):定义工程会生成一个可执行程序,

    源文件名可以用空格 或者 分号隔开,可执行程序名和project中的项目名没有任何关系,

    cmake_minimum_required(VERSION 3.10)
    project(test)
    add_executable(app add.cpp sub.cpp multi.cpp div.cpp main.cpp)
    
  4. 在创建的build目录中,执行cmake ../命令,生成makefile文件以及其他文件,

  5. 在创建的build目录中,执行make命令,生成可执行的目标文件,

1.变量定义

cmake可以使用 set 命令为自定义的变量进行赋值操作,默认为字符串类型,SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

  1. 源文件指定 set(SRC_LIST add.cpp sub.cpp multi.cpp div.cpp main.cpp)
  2. 编译C++版本标准指定 set(DCMAKE_CXX_STANDARD 11)
  3. 输出路径指定 set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
cmake_minimum_required(VERSION 3.10)
project(test)

# 指定C++编译版本
set(DCMAKE_CXX_STANDARD 11)

# 指定HOME路径
set(HOME /home/luochenhao/GNU_TOOLS/cmakeTest/test1)

# 指定源文件路径
set(SRC_LIST add.cpp sub.cpp multi.cpp div.cpp main.cpp)

# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

add_executable(app ${SRC_LIST})

2.指定源文件路径

通过指令搜索来简化源文件添加的过程,可以使用 aux_source_directory 命令或者 file 命令,

  • aux_source_directory([dir] [variable])
  • file(GLOB/GLOB_RECURSE [变量名] [要搜索的文件路径和文件类型])
    • CMAKE_CURRENT_SOURCE_DIR:当前CMakeList.txt文件所在的目录路径
    • PROJECT_SOURCE_DIR:执行cmake命令时后面跟随的参数路径
cmake_minimum_required(VERSION 3.10)
project(test)

# 指定C++编译版本
set(DCMAKE_CXX_STANDARD 11)

# 指定HOME路径
set(HOME /home/luochenhao/GNU_TOOLS/cmakeTest/test1)

# 通过搜索的方式指定源文件路径
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

add_executable(app ${SRC_LIST})

3.指定头文件路径

cmake_minimum_required(VERSION 3.10)
project(test)

# 指定C++编译版本
set(DCMAKE_CXX_STANDARD 11)

# 指定HOME路径
set(HOME /home/luochenhao/GNU_TOOLS/cmakeTest/test1)

# 通过搜索的方式指定头文件路径
include_directories(${HOME}/include)

# 通过搜索的方式指定源文件路径
aux_source_directory(${HOME}/src SRC_LIST)

# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

add_executable(app ${SRC_LIST})

4.字符串操作

关于字符串拼接可以使用set命令,也可以使用list命令,

  1. 字符串拼接set:set(target ${var1} ${var2} ...)

  2. 字符串追加list APPEND:list(APPEND [list] [<element> ....])

  3. 字符串移除list REMOVE_ITEM:list(REMOVE_ITEM [list] [<element> ....])

  4. 列表排序:list (SORT list COMPARE compare CASE case ORDER order)

    • COMPARE:指定排序方法

      STRING:按照字母顺序进行排序,为默认的排序方法

      FILE_BASENAME:如果是一系列路径名,会使用basename进行排序

      NATURAL:使用自然数顺序排序

    • CASE:指明是否大小写敏感

      SENSITIVE:按照大小写敏感的方式进行排序,为默认值

      INSENSITIVE:按照大小写不敏感方式进行排序

    • ORDER:指明排序的顺序

      ASCENDING:按照升序排列,为默认值

      DESCENDING:按照降序排列

  5. 获取 list 的长度:list(LENGTH [list] [output variable])

    • list列表
    • 子命令LENGTH用于读取列表长度,
    • 创建的变量,用于存储列表的长度,
  6. 读取列表中指定索引的的元素:list(GET [list] [element index] [index ...] [output variable])

    • list列表
    • element index列表元素的索引
    • 创建的变量,用于存储索引元素的返回结果也是一个列表,
  7. 将列表中的元素用连接符(字符串)连接起来组成一个字符串:list (JOIN [list] [glue] [output variable])

    • list列表
    • glue指定的连接符(字符串)
    • 创建的变量,用于存储返回的字符串
  8. 查找列表是否存在指定的元素,若果未找到,返回-1:list(FIND [list] [value] [output variable])

    • list列表
    • value需要搜索的元素
    • 创建的变量,如果列表中存在目标值,那么返回value在列表中的索引,否则返回 -1
  9. 在list中指定的位置插入若干元素:INSERT

  10. 将元素插入到列表的0索引位置:PREPEND

  11. 将列表中最后元素移除:POP_BACK

  12. 将列表中第一个元素移除:POP_FRONT

  13. ‘将指定索引的元素从列表中移除:REMOVE_AT

  14. 移除列表中的重复元素:REMOVE_DUPLICATES

  15. 列表翻转:REVERSE

# 字符串拼接
set(str1 hello world)
set(str2 ${str1} ${HOME})
message(${str1})
message(${str2})

# 字符串追加
list(APPEND str3 "this is a test." ${str2})
message(${str3})

# 字符串移除
message(${SRC_LIST})
list(REMOVE_ITEM SRC_LIST ${HOME}/src/main.cpp)
message(${SRC_LIST})

5.日志打印

message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "your detail message." ...)

  • 空:重要消息
  • STATUS:非重要消息
  • WARNING:CMake警告,会继续执行
  • AUTHOR_WARNING:CMake警告,会继续执行
  • SEND_ERROR:CMake错误,继续执行,但是会跳过生成的步骤
  • FATAL_ERROR:CMake错误,终止所有处理过程

CMake的命令行工具会在stdout上显示STATUS消息,在stderr上显示其他所有消息,CMake的GUI会在的log区域显示所有消息。

# 输出一般日志信息
message(STATUS "source path: ${PROJECT_SOURCE_DIR}")
# 输出警告信息
message(WARNING "source path: ${PROJECT_SOURCE_DIR}")
# 输出错误信息
message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}")

6.预定义宏

功能
PROJECT_SOURCE_DIR执行cmake命令后的参数目录
PROJECT_BINARY_DIR执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIRtarget 编译目录
EXECUTABLE_OUTPUT_PATH定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH定义目标链接库文件的存放位置
PROJECT_NAMEPROJECT指令定义的项目名称
CMAKE_BINARY_DIR项目实际构建路径,如果在build目录进行的构建,得到的就是该目录路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/192313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java Flight Record 详解

核心概念 Java Flight Record 提供一个低开销的数据收集框架&#xff0c;用于对 Java 应用程序和 HotSpot JVM 进行故障排除。Flight Recorder 记录源自应用程序、JVM和操作系统的事件 Flight Record&#xff0c;顾名思义&#xff0c;相当于飞机黑匣子里保存的飞行记录 事件 …

2023-11-27 LeetCode每日一题(子数组的最小值之和)

2023-11-27每日一题 一、题目编号 907. 子数组的最小值之和二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff…

Shopee买家号想要多开怎么解决?

拥有多个Shopee买家号有很多优势。多账号可以帮助卖家获得更多流量、还能帮助提供关键词排名、提高销量等。 但是要管理多个Shopee买家号并非易事。面对不同账号的登录、注销和切换&#xff0c;可能会花费大量的时间和精力。而且&#xff0c;Shopee平台对于使用同一IP地址同时登…

DevEco Studio在预览器上快速定位元素所在的组件代码位置

常规开发过程中 如果我们的组件过多 找对象就会比较困难 我们可以点击如下图指向位置 这边呢 就有一个组件树 我们可以快速定位到当前元素的代码位置 同时你在点元素的时候 代码它也给你标记出来了

仅2万粉,带了2.6万件的货!TikTok Shop美区达人周榜(11.13-11.19)

11月24日&#xff0c;TikTok Shop近日公布了美国市场和英国市场的全托管黑五大促战绩。数据显示&#xff0c;11月14日至11月20日&#xff0c;其美国市场的订单量环比10月20日-10月26日增长了205%。 家居户外热销品有&#xff1a;数码触摸屏相框、毛绒地毯、家居毛毯。黑马商品…

C语言基础篇5:指针(一)

指针是C语言的核心、精髓所在&#xff0c;用好了指针可以在C语言编程中起到事半功倍的效果。指针一方面可以提高程序的编译效率和执行速度&#xff0c;而且还可以通过指针实现动态的存储分配&#xff0c;另一方面使用指针可使程序更灵活&#xff0c;便于表示各种数据结构&#…

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)

FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证&#xff0c;主要验证方式包括以下三种&#xff1a;   1&#xff09;手工注册验证类&#xff0c;并在控制器或其它模块中调用验证&#xff1b;   2&#xff09;基于ASP.NET验证管道&#xff08;validation …

CountDownLatch实战应用——批量数据多线程协调异步处理(主线程执行事务回滚)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CountDownLatch实战应用——批量数据多线程协调异步处理(主线程执行事务…

基于SpringBoot的超市信息管理系

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着我国经济的不断发…

送PDF书 | 豆瓣9.2分,超250万Python新手的选择!蟒蛇书入门到实践

在此疾速成长的科技元年&#xff0c;编程就像是许多人通往无限可能世界的门票。而在编程语言的明星阵容中&#xff0c;Python就像是那位独领风 骚的超级巨星&#xff0c; 以其简洁易懂的语法和强大的功能&#xff0c;脱颖而出&#xff0c;成为全球最炙手可热的编程语言之一。 …

【第二节:微信小程序 app.json配置】微信小程序入门,以思维导图的方式展开2

以思维导图的方式呈现出来&#xff0c;是不是会更加直观一些呢 如果看不清楚&#xff0c;私信给单发 &#xff1a; 第二节&#xff1a;微信小程序 app.json配置&#xff1a; 包括&#xff1a; window pages tabBar networkTimeout debug 如下图所示&#xff1a; 2、ap…

使用 OpenCV 发现圆角矩形的轮廓

OpenCV - 如何找到圆角矩形的矩形轮廓? 问题: 在图像中,我试图找到矩形对象的圆角轮廓。然而,我对两者的尝试 HoughLinesP 并 findContours 没有产生预期的结果。 我的目标是找到一个类似于以下形状的矩形: 。 代码: import cv2 import matplotlib.pyplot as plt…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

[C/C++]数据结构 堆排序(详细图解)

一:前言 在[C/C]数据结构 堆的详解中,介绍了什么是堆,并且完成了堆的实现和一系列接口,包括向上调整法和向下调整法等,接下来小编介绍一个有点量级的排序方法------堆排序,时间复杂度为O(n*lgn) 二:堆排序详解 2.1 方法介绍 1.首先将待排序数组建为大堆,此时堆顶元素就为数组…

Linux操作系统 1.初识Linux

一、Linux学习大致内容 二、操作系统概述 操作系统的作用&#xff1a; 常见操作系统&#xff1a; 1、pc&#xff08;电脑端&#xff09;&#xff1a;windows、Linux、MacOS 2、移动端&#xff1a;Android、ios、鸿蒙系统 总结 1.计算机由哪两个部分组成&#xff1f;、 硬件…

04:2440---内存控制器

目录 一:介绍 1:引入 2:概念 3:通信 A:片选信号 B:片选信号的地址空间范围 ​​​​ 4:地址线 A:不同位数的接法 B:访问原理 C:访问地址 5:时序 1:NOR FLASH A:2440NOR FLASH时序 B:原理/时序图 C:寄存器 6:SDARM A:访问方式 B:原理图 C:BWSCON D:BANKCON…

【Linux系统编程】操作系统详解(什么是操作系统?为什么会存在操作系统?设计操作系统的目的是什么?)

目录 一、前言 二、 什么是操作系统 &#x1f4a6;操作系统的引入 &#x1f4a6;操作系统的概念理解 &#x1f4a6;操作系统设计的目的与定位 &#x1f4a6;总结 二、操作系统之上之下分别有什么 三、深度理解操作系统的“管理” &#x1f4a6;场景理解 &#x1f4a6;操…

视频文件+EasyDarwin做摄像机模拟器模拟RTSP流很方便,还能做成系统服务,方法与流程

之前我看到过一家人工智能做算法的企业&#xff0c;用EasyDarwinFFMPEG做了一个摄像机的模拟器&#xff0c;方法大概是&#xff1a; 用ffmpeg读取mp4等类型的视频文件&#xff08;当然ffmpeg啥都能读取&#xff09;&#xff0c;再以RTSP协议的形式推送给EasyDarwin&#xff1b…

不会提问不打紧,不敢提问才要命

最近在星球里回答了球友提出来的一些问题&#xff0c;我都给了回复&#xff0c;不经过在明确问题、探索问题的过程&#xff0c;对我启发挺大&#xff0c;特此来记录下感受和感悟。 缘起 最近新加入球友提的问题&#xff0c;有几次&#xff0c;我第一时间没看懂&#xff0c;甚…

【沐风老师】3DMAX快速地板屋顶墙面铺设插件使用方法详解

3DMAX快速地板屋顶墙面铺设插件使用教程 3DMAX快速地板屋顶墙面铺设插件&#xff0c;一键生成各种地板、墙面纹理模型&#xff0c;是一款非常实用的室内设计和建筑建模插件。 【适用版本】 3dMax7或更新版本 【安装方法】 该插件无需安装&#xff0c;直接在建模过程中使用&a…