【笔记】编写cmakelist的常用命令含义及使用

文章目录

    • 命令
      • project
      • file
      • set
      • configure_file
      • list
      • add_library
      • set_target_properties
      • target_link_directories
      • target_link_libraries
      • target_compile_definitions
      • add_subdirectory
      • function

持续更新

命令

project

  • 用于定义一个项目,它是 CMakeLists.txt 文件中的第一个命令,通常也是必须的命令。project 命令的主要作用是设置项目的名称,并且可以指定项目的版本和语言。

  • ex

    project(MyProject VERSION 1.0.0 LANGUAGES CXX)
    
  • 后续使用项目名MyProject时可以直接使用宏${PROJECT_NAME}替换

file

  • 用于执行各种文件和目录相关的操作。它可以用来读写文件、创建目录、删除文件、获取文件属性等
    1. file(READ):读取文件内容到一个变量中。
    2. file(WRITE):将内容写入到一个文件中。
    3. file(APPEND):将内容追加到一个文件的末尾。
    4. file(GLOB):搜索匹配特定模式的文件,并将结果存储在一个变量中。
    5. file(MAKE_DIRECTORY):创建一个目录。
    6. file(REMOVE):删除文件。
    7. file(COPY):复制文件或目录。
    8. file(REAL_PATH):获取文件的绝对路径

set

  • 用于设置一个变量的值。这个变量可以是普通的变量、缓存变量或者环境变量

configure_file

  • 通常用于生成配置头文件、资源文件或者是一些根据构建系统变量动态生成的文件。
  • 例如,如果你有一个名为 config.h.in 的模板文件,其中包含了如下内容:
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
project(MyProject VERSION 1.0)
configure_file(config.h.in config.h)

在生成 config.h 文件时,@PROJECT_VERSION_MAJOR@ 和 @PROJECT_VERSION_MINOR@ 会被替换为项目的版本号中的主要和次要版本号。

list

  • 用于操作列表类型的变量
    1. LENGTH:获取列表的长度。
    2. APPEND:向列表末尾添加一个或多个元素。
    3. FIND:在列表中查找一个元素的索引。

add_library

  • 用于定义一个库目标,这个库目标可以是静态库、共享库或者是一个对象库。定义库目标后,CMake 会生成相应的构建规则,以便在构建过程中编译库的源代码。
  • 在定义库目标之后,你可以使用 target_link_libraries 命令来指定库应该链接的其他库,使用 target_include_directories 来指定库的包含目录,以及其他用于配置目标属性的命令。
add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][source1] [source2] [...])
  • name:指定库目标的名称。这个名称用于在 CMake 项目中引用库目标。
  • [STATIC | SHARED | MODULE]:指定库的类型。STATIC 表示静态库,SHARED 表示共享库(动态链接库),MODULE 表示不会被直接链接的模块,通常用于插件。如果省略这个参数,CMake 会根据变量 BUILD_SHARED_LIBS 的值决定是生成静态库还是共享库
  • [EXCLUDE_FROM_ALL]:如果指定了这个选项,那么这个库目标不会默认被构建,除非明确指定要构建它。
  • [source1] [source2] […]:指定库的源代码文件。这些文件将会被编译并包含在库中。

set_target_properties

  • 用于设置一个目标的属性,这些属性可以控制目标的构建行为,比如编译选项、链接选项、包含目录、输出目录等

  • ex

        set_target_properties(MyExecutable PROPERTIESOUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"COMPILE_FLAGS "-Wall -Wextra")
    
  • 在这个例子中,OUTPUT_DIRECTORY 属性被设置为构建目录下的 bin 子目录,而 COMPILE_FLAGS 属性被用来添加额外的编译器警告标志。

target_link_directories

  • 用于指定目标链接时搜索库文件的目录的命令。这个命令告诉 CMake 当编译一个目标(比如可执行文件或库)时,到哪里查找需要的库文件。
target_link_directories(<target> [BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...]...
)
  • :指定要添加链接目录的目标,这个目标必须是之前通过 add_executable()add_library() 创建的。
  • [BEFORE]:可选参数,如果指定,这些目录将在目标自己的链接目录之前被搜索。
  • <INTERFACE|PUBLIC|PRIVATE>:指定链接目录的作用域。
    • INTERFACE:目录只会影响那些链接到目标的其他目标。
    • PUBLIC:目录会影响目标本身和链接到目标的其他目标。
    • PRIVATE:目录只会影响目标本身
  • [items1…]:要添加的目录列表。

target_link_libraries

  • 用于指定目标(如可执行文件或库)链接时需要的库。这个命令告诉 CMake 在构建一个目标时,需要链接哪些库,以及这些库的链接顺序。

  • 在链接库时,库的顺序很重要,特别是当链接器依赖于库的依赖关系顺序时。CMake 会按照你指定的顺序将库传递给链接器。

  • ex

    target_link_libraries(MyExecutable Qt5::Gui Qt5::Widget)
    

target_compile_definitions

  • 用于为特定的目标(如可执行文件或库)添加或取消编译定义。编译定义通常用于条件编译,它们可以在源代码中通过预处理器指令(如 #ifdef)来检测。

add_subdirectory

  • 用于将一个子目录添加到构建树中。这个命令会使得 CMake 处理子目录中的 CMakeLists.txt 文件,并添加其中的构建目标到当前项目的构建系统中

function

  • 用于定义一个自定义函数,这样你就可以在 CMake 脚本中重复使用一段代码
  • ex 如果你想定义一个函数来计算两个数的和,并返回结果
function(calculate_sum a b output)math(EXPR sum "${a} +${b}")set(${output}${sum} PARENT_SCOPE)
endfunction()# 调用自定义函数并获取返回值
calculate_sum(5 3 result)
message(STATUS "The sum is: ${result}")

在这个例子中,calculate_sum 函数接受两个输入参数 a 和 b,以及一个输出参数 output。函数内部使用 math(EXPR) 命令计算两数之和,并使用 set 命令将结果存储在 output 参数中。PARENT_SCOPE 选项确保输出参数的值在函数外部可见。

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

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

相关文章

unity动画的关键帧添加event-同步语音

在iclone中做的语音嘴型动画&#xff0c;因是用下图自带的方式语音生成的动画&#xff0c;而不是用plugin(面捕live会连同语音一起导出)&#xff0c;所以导出来到Unity中&#xff0c;之后口型、动作、表情等没有声音。 我需要把原有的语音也重新在unity中加载上&#xff0c;原来…

解决WPS右键菜单冗余选项,去除WPS右键菜单选项

问题描述 安装WPS后&#xff0c;右键菜单会多出许多无用的选项&#xff0c;如何去除&#xff1f; 解决方法 按下WindowsS打开搜索栏&#xff0c;搜索配置工具打开 勾选所有的关闭和隐藏选项

汽车视频智能剪辑解决方案,满足用户对高品质汽车视频的追求

随着汽车智能化和互联网技术的快速发展&#xff0c;车载视频已经成为现代驾驶生活不可或缺的一部分。然而面对海量的行车视频&#xff0c;如何高效地剪辑、整理并分享这些精彩瞬间&#xff0c;一直是车主和汽车内容创作者们所面临的难题。美摄科技&#xff0c;作为领先的视频智…

Postgres数据库中的死锁是如何产生的,如何避免和解决?

文章目录 死锁的产生原因如何避免死锁如何解决死锁示例代码查询死锁信息终止事务 在Postgres数据库中&#xff0c;死锁是一种特殊的情况&#xff0c;其中两个或多个事务相互等待对方释放资源&#xff0c;从而导致它们都无法继续执行。这种情况通常发生在多个事务尝试以不同的顺…

rtpengine 的端点学习模式

端点学习模式&#xff08;endpoint-learning&#xff09; delayed|immediate|off|heuristic delayed 延迟模式&#xff0c;等待 3 秒钟&#xff0c;然后再提交到端点地址 immediate 立即模式&#xff0c;收到第一个 rtp 包之后立即学习&#xff0c;不等 3 秒 off 关闭模式…

【LeetCode】【0-1背包】目标和

题目链接&#xff1a;494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 要在数组中通过加减元素得到目标和&#xff0c;记加的元素和为x&#xff0c;减的元素和为y&#xff0c;即x-ytarget 又因为xysum&#xff0c;两式相加&#xff0c;可以求得x&#xff08;targetsum&a…

SQL255 给出employees表中排名为奇数行的first_name

题目来源&#xff1a; 给出employees表中排名为奇数行的first_name_牛客题霸_牛客网 描述 对于employees表中&#xff0c;输出first_name排名(按first_name升序排序)为奇数的first_name CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, firs…

CSS transition和animation的用法和区别

Transition和Animation在CSS中都是用于实现元素状态变化的效果&#xff0c;但它们在用法和特性上存在明显的区别。 Transition transition是过度属性&#xff0c;主要强调的是元素状态的过渡效果。 它通常用于在元素的状态发生变化时&#xff0c;平滑地过渡到一个新的状态。…

高德地图API-鼠标点击地图获取经纬度坐标(关键操作)

效果图&#xff1a; 有了经纬度坐标&#xff0c;就可以得到城市的&#xff1a;adcode区域编码 html版本 <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"&g…

瞪羚企业申报要求材料

申报企业还需提供以下材料&#xff0c;并依顺序装订成册。申报材料的内容一定要能够公开的&#xff0c;不会涉及到国家安全等机密信息。 1.“瞪羚企业”认定申请书&#xff1b; 2.企业营业执照复印件&#xff1b; 3.经审计的近三年的财务报告&#xff1b; 4.近3年企业所得税…

低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

要优化低配置电脑上WPF DataGrid的刷新卡顿问题&#xff0c;可以尝试以下几种方法&#xff1a; 启用虚拟化技术&#xff1a; VirtualizingStackPanel.IsVirtualizing"True" 。 WPF DataGrid支持行虚拟化&#xff0c;这意味着只有当前可见的行会被加载和渲染&#xf…

HarmonyOS NEXT中怎么理解HAR、HAP、HSP、App的关系

文章目录 一、HAR1.1 简介1.2 使用场景1.3 约束限制 二、HAP2.1 简介2.2 使用场景2.3 约束限制 三、HSP3.1 简介3.2 使用场景3.3 约束限制 四、小结 一、HAR 1.1 简介 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件…

backtracking Leetcode 回溯算法题

77.组合 第一个位置选择有 n 种&#xff0c;接下来每个位置只能在前面选择数字的后面选&#xff0c;所以有了 beg 参数&#xff0c;才能保持不重复 剪枝&#xff1a;res.size (n - beg 1) < k , 已有答案的长度 剩余所有未选择的个数 都小于最终答案长度了 就没有必要尝…

Unity类银河恶魔城学习记录13-1 p142 Save system源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

数据结构学习记录

数据结构 数组 & 链表 相连性 | 指向性 数组可以迅速定位到数组中某一个节点的位置 链表则需要通过前一个元素指向下一个元素&#xff0c;需要前后依赖顺序查找&#xff0c;效率较低 实现链表 // head > node1 > node2 > ... > nullclass Node {constructo…

基于springboot+vue+Mysql的社区维修平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

软件产品许可证书 Licence 全流程研发(使用非对称加密技术,既安全又简单)

本篇博客对应的代码地址&#xff1a; Gitee 仓库地址&#xff1a;https://gitee.com/biandanLoveyou/licence 源代码百度网盘链接: https://pan.baidu.com/s/1_ZhdcENcrk2ZuL11hWDLTQ?pwdbmxi 提取码: bmxi 1、背景介绍 公司是做软件 SAAS 服务的&#xff0c;一般来说软件部…

分析SQL中的ON后面AND条件与WHERE后AND的区别及其应用场景

引言ON条件 - 连接条件 示例1 - ON条件用于连接表示例2 - ON中多个连接条件WHERE条件 - 数据过滤 示例3 - WHERE条件应用于连接结果区别与结合使用总结 引言 在SQL查询中&#xff0c;JOIN子句的ON条件和WHERE子句的AND条件都用于筛选数据&#xff0c;但它们的应用上下文和作用方…

RabbitMQ项目实战(一)

文章目录 RabbitMQ项目实战选择客户端基础实战 前情提要&#xff1a;我们了解了消息队列&#xff0c;RabbitMQ的入门&#xff0c;交换机&#xff0c;以及核心特性等知识&#xff0c;现在终于来到了激动人心的项目实战环节&#xff01;本小节主要介绍通过Spring Boot RabbitMQ S…

AppsFlyer 接入更新

SDK文档 最新的 SDK 已经支持了 UPM 的接入方式&#xff0c;直接输入链接就可以安装好&#xff0c; 只需要 resolve 通过然后就可以使用了。