Cmake语法学习2:常用变量

news2025/1/26 15:33:02

目录

1.常用变量简介

1.1提供信息的变量

1.2改变行为的变量

1.3描述系统的变量

​编辑1.4控制编译的变量

2.提供信息的变量

2.1PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR

2.2 CMAKE_SOURCE_DIR 和 CMAKE_BINARY_DIR

2.3CMAKE_CURRENT_SOURCE_DIR 和CMAKE_CURRENT_BINARY_DIR

2.4 CMAKE_VERSION、CMAKE_MAJOR_VERSION 和 CMAKE_MINOR_VERSION

2.5PROJECT_VERSION、PROJECT_VERSION_MAJOR 和 PROJECT_VERSION_MINOR

 2.6CMAKE_PROJECT_NAME 和 PROJECT_NAME

3.改变行为的变量

3.1 BUILD_SHARED_LIBS

3.2 CMAKE_BUILD_TYPE

3.3 CMAKE_SYSROOT

3.4 CMAKE_INCLUDE_PATH   

3.5 CMAKE_LIBRARY_PATH

3.6 CMAKE_MODULE_PATH

3.7 CMAKE_INCLUDE_DIRECTORIES_BEFORE

3.8 CMAKE_IGNORE_PATH

4.描述系统的变量

4.1CMAKE_HOST_SYSTEM_NAME 、 CMAKE_HOST_SYSTEM_PROCESSOR 、CMAKE_HOST_SYSTEM 和 CMAKE_HOST_SYSTEM_VERSION

4.2 CMAKE_SYSTEM_NAME 、 CMAKE_SYSTEM_PROCESSOR 、 CMAKE_SYSTEM和CMAKE_SYSTEM_VERSION

 4.3 ENV

5.控制编译的变量

5.1EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH


1.常用变量简介

1.1提供信息的变量

1.2改变行为的变量

1.3描述系统的变量

1.4控制编译的变量

2.提供信息的变量

2.1PROJECT_SOURCE_DIR PROJECT_BINARY_DIR

1)介绍

        PROJECT_SOURCE_DIR变量表示工程的顶级目录,也就是顶层 CMakeLists.txt 文件所在目录;
        PROJECT_BINARY_DIR变量表示工程的BINARY_DIR ,也 就是顶层 CMakeLists.txt 源码对应的BINARY_DIR(输出文件目录),camke命令所在文件夹。

2)例子

目录结构

├── build
├── CMakeLists.txt
└── main.c

CMakeLists.txt 

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO)
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})

执行结果

2.2 CMAKE_SOURCE_DIR CMAKE_BINARY_DIR

         与上面等价

2.3CMAKE_CURRENT_SOURCE_DIR 和CMAKE_CURRENT_BINARY_DIR

1)介绍

CMAKE_CURRENT_SOURCE_DIR当前源码的路径;

CMAKE_CURRENT_BINARY_DIR指的是当前源码的 BINARY_DIR;

2)例子

目录结构

├── build
├── CMakeLists.txt
├── main.c
└── src
     └── CMakeLists.txt

 CMakeLists.txt

# src 下的 CMakeLists.txt
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})

执行结果

2.4 CMAKE_VERSIONCMAKE_MAJOR_VERSION CMAKE_MINOR_VERSION

 1)介绍

        记录 cmake 的版本号

2)例子

目录结构 

# CMakeLists.txt
message(${CMAKE_VERSION})
message(${CMAKE_MAJOR_VERSION})
message(${CMAKE_MINOR_VERSION})

执行结果

2.5PROJECT_VERSIONPROJECT_VERSION_MAJOR PROJECT_VERSION_MINOR

 1)介绍

        记录工程的版本号,其实可以给工程设置一个版本号,通过 project()命令进行设置

2)例子

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 打印
message(${PROJECT_VERSION})
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})

执行结果

 2.6CMAKE_PROJECT_NAME 和 PROJECT_NAME

1)介绍

        记录了工程的名字

2)例子

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 打印工程名字
message(${CMAKE_PROJECT_NAME})
message(${PROJECT_NAME})

执行结果

3.改变行为的变量

3.1 BUILD_SHARED_LIBS

1)介绍

        对于 add_library()命令,当没有显式指定生成动态库时(SHARED 选项),默认生成的是静态库;其实我们可以通过 BUILD_SHARED_LIBS 变量来控制 add_library()命令的行为,当将变量设置为 on 时表示使能动态库,则 add_library()默认生成的便是动态库文件;当变量设置为 off 或未设置时,add_library()默认生成的便是静态库文件。

2)例子

├── build
├── CMakeLists.txt
├── hello
│     └── hello.c
└── world
      └── world.c
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0)
set(BUILD_SHARED_LIBS on)
add_library(hello hello/hello.c)
add_library(world world/world.c)

         进入到 build 目录下,执行 cmakemake 进行构建、编译,将会生成动态库文件 libhello.solibworld.so

3.2 CMAKE_BUILD_TYPE

1)介绍

        设置编译类型 Debug 或者 Release debug 版会生成相关调试信息,可以使用 GDB 进行调试; release 会生成调试信息:
# Debug 版本
set(CMAKE_BUILD_TYPE Debug)
# Release 版本
set(CMAKE_BUILD_TYPE Release)

3.3 CMAKE_SYSROOT

        cmake 会将该变量传递给编译器 --sysroot 选项,通常我们在设置交叉编译时会使用到。

3.4 CMAKE_INCLUDE_PATH   

 1)介绍

        (1)为find_file()和find_path()命令指定搜索路径的目录列表。

        (2)分别用于查找文件、路径,需要传入文件名。find_file()命令会将该文件的全路径返回;

        find_path()会将文件的所在目录返回。

        (3)在搜索文件的时候,需要通过CMAKE_INCLUDE_PATH 指定一个目录列表。find_file()和find_path()在这个目录列表中查找文件。

2)例子

├── build
├── CMakeLists.txt
└── src
    └── hello.c
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 设置 CMAKE_INCLUDE_PATH 变量
set(CMAKE_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/src)
# 查找文件
find_file(P_VAR hello.c)
message(${P_VAR})

执行结果

3.5 CMAKE_LIBRARY_PATH

        指定 find_library()命令的搜索路径的目录列表。find_library()命令用于搜索库文件,find_library()将会从CMAKE_LIBRARY_PATH 变量设置的目录列表中进行搜索。

3.6 CMAKE_MODULE_PATH

        指定要由 include()find_package()命令加载的 CMake 模块的搜索路径的目录列表。

3.7 CMAKE_INCLUDE_DIRECTORIES_BEFORE

         include_directories()命令默认情况下会将目录添加到列表的后面,如果将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 on,则include_directories()命令会将目录添加到列表前面;同理若将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 off 或未设置该变量,include_directories()会将目录添加到列表后面。

3.8 CMAKE_IGNORE_PATH

        要被 find_program()、find_library()find_file()find_path()命令忽略的目录列表。表示这些命令不会去CMAKE_IGNORE_PATH 变量指定的目录列表中搜索。

4.描述系统的变量

4.1CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_PROCESSOR 、CMAKE_HOST_SYSTEM CMAKE_HOST_SYSTEM_VERSION

1)介绍

        这四个变量运行 cmake 的主机相关的信息。
2)打印信息
# 打印信息
message(${CMAKE_HOST_SYSTEM_NAME})
message(${CMAKE_HOST_SYSTEM_PROCESSOR})
message(${CMAKE_HOST_SYSTEM})
message(${CMAKE_HOST_SYSTEM_VERSION})

打印信息

4.2 CMAKE_SYSTEM_NAME CMAKE_SYSTEM_PROCESSOR CMAKE_SYSTEMCMAKE_SYSTEM_VERSION

1) 介绍

        用于描述目标主机相关的信息,目标主机指的是可执行文件运行的主机,譬如我们的ARM 开发板。

2)例子

# 打印信息
message(${CMAKE_SYSTEM_NAME})
message(${CMAKE_SYSTEM_PROCESSOR})
message(${CMAKE_SYSTEM})
message(${CMAKE_SYSTEM_VERSION})
打印信息

 4.3 ENV

 1)介绍

        用于访问环境变量,用法很简单$ENV{VAR}        

2)例子

# 访问环境变量
message($ENV{XXX})

      首先在 Ubuntu 系统下使用 export 命令导出XXX 环境变量。

export XXX="Hello World!"
cd build/
cmake ..

 执行结果

5.控制编译的变量

5.1EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH

1)介绍

       分别用来设置可执行文件的输出目录以及库文件的输出目录 

2)例子

├── build
├── CMakeLists.txt
├── hello
│     ├── hello.c
│     └── hello.h
└── main.c

        hello.c 会被编译成动态库文件 libhello.so,而 main.c 会被编译成可执行程序,main.c 源码中调用了 hello.c 提供的函数。

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 设置可执行文件和库文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
# 头文件包含
include_directories(hello)
# 动态库目标
add_library(hello SHARED hello/hello.c)
# 可执行程序目标
add_executable(main main.c)
target_link_libraries(main PRIVATE hello) #链接库

         进入到build目录下,执行cmakemake进行构建、编译,最终会生成可执行文件main和库文件libhello.so。

        执行结果

├── build
│     ├── bin
│     │     └── main
│     ├── lib
│     └── libhello.so
├── CMakeLists.txt
├── hello
│     ├── hello.c
│     └── hello.h
└── main.c

        这是因为我们通过设置 EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH 才会使得生成的可执行程序在 build/bin 目录下、生成的库文件在 build/lib 目录下,如果把这两行给注释掉,那么生成的文件在 build 目录中,因为默认情况下,最终的目标文件的输出目录就是源码的 BINARY_DIR

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

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

相关文章

如何用AI人工智能写作?6个AI写作神器推荐

在日常生活中,我们往往会遇到一些关于写作方面的难题,毕竟传统的写作方式还是会存在一些局限性,幸运的是,随着人工智能技术的不断发展,AI写作已经成为了现实。AI写作神器可以帮助我们提高写作效率,解决写作…

骨传导耳机的技术原理是什么?和传统耳机相比有哪些优点?

骨传导耳机通过人体骨骼来传递声音,可以绕过耳道和耳膜直接传达音频到听者的内耳,开放双耳的佩戴方式可以在享受音乐或通话的同时保持对周围环境的感知,这种设计在户外活动或运动等场景下的使用尤为实用,可以避免堵塞耳朵&#xf…

RK3568驱动指南|驱动基础进阶篇-进阶1 编译进内核的驱动系统是如何运行的?

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Python实现排序算法

目录 一&#xff1a;快速排序 二&#xff1a;合并排序 三&#xff1a;冒泡排序 四&#xff1a;插入排序 五&#xff1a;选择排序 一&#xff1a;快速排序 def quicksort(arr): if len(arr) < 1: return arr pivot arr[len(arr) // 2] le…

Unity | 渡鸦避难所-9 | 角色名字及血条等信息

1 效果预览 游戏中角色的名字和血条是非常重要的元素&#xff0c;它们可以帮助玩家了解角色的身份和状态。在 Unity 中&#xff0c;可以使用 UGUI 来实现这些功能 2 实现方案 1 画布 (Canvas) 画布 (Canvas) 组件表示进行 UI 布局和渲染的抽象空间。所有 UI 元素都必须是附加…

UE5 虚幻游戏报错常用解决方法(幻兽帕鲁UE5报错)

在体验使用虚幻引擎5、4&#xff08;UE5/UE4&#xff09;开发的游戏如《幻兽帕鲁》时&#xff0c;玩家可能会遇到各种报错情况&#xff0c;例如黑屏、闪退、C运行时错误等。本博客将汇集一系列有效解决方案&#xff0c;通过调整虚幻引擎内置命令行参数以及优化系统环境&#xf…

环状热力图R语言画法

环状热力图&#xff08;Circular Heatmap&#xff09;是一种以环状布局展示数据的可视化方法。它结合了热力图和极坐标系统&#xff0c;能够有效地显示数据的关系、模式和趋势。 环状热力图通常用于可视化二维数据矩阵&#xff0c;其中行和列代表不同的类别或变量&#xff0c;…

“欢天喜地迎新春”下姜村邻里守望写对联活动

卯兔追冬去&#xff0c;辰龙报春来。空谷幽香谱佳期&#xff0c;红联金句寄吉祥。春联是我国特有的文学形式&#xff0c;贴春联是继承传统习俗的一种方式&#xff0c;是对祖先的尊敬&#xff0c;对传统的继承。春节前夕&#xff0c;家家户户贴上红红的春联&#xff0c;一副副透…

前妻(C#)-基础03-枚举-预处理指令

前妻C#-基础语法03 枚举关于控制台IO及注释C#预处理指令 枚举 枚举是用户定义的整数类型。在声明一个枚举时&#xff0c;要指定改枚举的实例可以包含的一组可接受的值。不仅如此&#xff0c;还可以给值指定易于记忆的名称&#xff0c;如果在代码的某个地方&#xff0c;要试图把…

【SpringCloud】使用OpenFeign进行微服务化改造

目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…

QT SQL

QT SQL模块提供数据库编程的支持&#xff0c;支持多种常见的数据库&#xff1a;MySQL\Oracle\MS SQL Server\SQLite等。SQL模块包含多个类&#xff0c;可以实现&#xff1a;数据库连接、SQL语句执行、数据获取与界面显示 等功能。数据 与 界面间用Model\View架构。 一、 二、Q…

禅道列表页编辑页添加页自定义字段

1&#xff0c;数据库表 zt_story 添加自定义字段 bakDate1&#xff0c;bakDate2&#xff0c;bakDate3&#xff0c;bakDate4 2&#xff0c;在 /opt/lampp/htdocs/zentaopms/extension/custom/story/ext/config 中添加bakDate.php文件 <?php $config->story->datatab…

【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!

【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 本人是计算机博士&#xff0c;拥有10年网球球龄&#xff0c;2023年的温网决赛&#xff0c;熬夜到半夜全称观看完了直播&#xff0c;对于网球规则、比赛的数据非常熟悉&#xff0c;这个…

【代码随想录-链表】环形链表 II

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

windows下使用verdaccio构建npm私服环境

一.背景 npm太慢了&#xff0c;每次jenkins自动构建等太久&#xff0c;我虽然是后端coder&#xff0c;也看不惯。本文目的只是说明怎么搭建npm私服&#xff0c;我现在只想构建快一点。所以&#xff0c;暂时没有考虑多个开发者将自定义组件上传到私库并共享的问题&#xff0c;以…

Linux中判断文件系统的方法

文章目录 Linux中判断文件系统的方法1.使用mount命令2.使用blkid命令3.使用file命令4.使用fstab文件5.使用df命令&#xff08;这个用的比较多&#xff09;6.使用fsck命令7.使用lsblk命令(推荐-简单好用) Linux中判断文件系统的方法 1.使用mount命令 # 这样查看的只有已经挂载…

Python系列-字典

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” ​ 目录 ​ 字典是什么 创建字典 查找key 新增/修改元素 删除元素 遍历字典元素 取出所有的key和value 合成的key类型 ​编辑 小结 字典是什么 字典是一种存储键值对的结…

D2632——LDO系列电路,高精度、大电流、低压差。最大输出电流可达3A,应用于汽车电子设备等产品中

D2632是一款高精度、大电流、低压差电压调整器。主要作为电源装置提供高效的电压调整。 最大输出电流可达3A&#xff0c;并且外接器件少&#xff0c;拥有输出电压(ADJ) 可调特点。 主要特点&#xff1a; 1. 低压差(满载350mV); 2. 地电流小; 3. 精确度保证在士1%; 4. 非常快速…

C++中的字符串翻转算法解析

个人主页&#xff1a;[PingdiGuo_guo] 收录专栏&#xff1a;[C干货专栏] 大家好&#xff0c;今天我们来学一下C里的一个知识&#xff1a;字符串翻转。 目录 1.题目 描述 输入描述 输出描述 输入数据 1 输出数据 1 提示 2.解决题目 1.所需知识点 2.算法分析 1. 拼接…

【PostgresSQL系列】 ltree简介及基于SpringBoot实现 ltree数据增删改查

本文将对PostgresSQL中的ltree进行相关概念介绍&#xff0c;并以示例代码讲解ltree数据增删改查功能的实现。 作者&#xff1a;后端小肥肠 目录 1.前言 2. 基础概念 2.1. ltree 2.2. lquery 2.3. ltxtquery 2.4. ltree函数及操作符 2.4.1. ltree函数 2.4.2. ltree操作符…