Cmake语法学习2:常用变量

目录

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

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

相关文章

【文件上传WAF绕过】<?绕过、.htaccess木马、.php绕过

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

【笔记】React Native实战练习(仿网易云游戏网页移动端)

/** * 如果系统看一遍RN相关官方文档,可能很快就忘记了。一味看文档也很枯燥无味, * 于是大概看了关键文档后,想着直接开发一个Demo出来,边学边写,对往后工作 * 开发衔接上能够更顺。这期间肯定会遇到各种各样的问题&a…

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用: 实现按钮的文本切换 QStateMachine machine; //定义状态机(头文件定义)QState *off new QState(); //添加off 状态off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该…

025 break,continue,goto

什么是break for (int i 1; i < 10; i) {if(i 5){break;}System.out.println(i); } // 结果为 1 2 3 4 什么是continue for (int i 1; i < 10; i) {if(i 5){continue;}System.out.println(i); } // 结果为 1 2 3 4 6 7 8 9 关于goto关键字 String str ""…

2024年美国大学生数学建模竞赛(C题)探寻网球中的“动量”奥秘|DQN算法和Monte Carlo模拟建模解析,小鹿学长带队指引全代码文章与思路

我是小鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 探寻网球比赛中的“动量”奥秘&#xff01;鹿鹿学长独辟蹊径&#xff0c;运用强化学习与时间序列分析相结合&#xff0c;以DQN和Monte Carlo模拟实现对…

完整的 HTTP 请求所经历的步骤及分布式事务解决方案

1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c; 特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 首先要搞清楚&#xff1a;ACID、CAP、BASE理论。 ACID 指数据库事务正确执行…

基于数据挖掘的微博事件分析与可视化大屏分析系统

设计原理&#xff0c;是指一个系统的设计由来&#xff0c;其将需求合理拆解成功能&#xff0c;抽象的描述系统的模块&#xff0c;以模块下的功能。功能模块化后&#xff0c;变成可组合、可拆解的单元&#xff0c;在设计时&#xff0c;会将所有信息分解存储在各个表中&#xff0…

【论文解读】Collaboration Helps Camera Overtake LiDAR in 3D Detection

CoCa3D 摘要引言Collaborative Camera-Only 3D DetectionCollaborative depth estimationCollaborative detection feature learning 实验结论和局限 摘要 与基于 LiDAR 的检测系统相比&#xff0c;仅相机 3D 检测提供了一种经济的解决方案&#xff0c;具有简单的配置来定位 3…

MySQL进阶45讲【11】怎么更好地给字符串字段加索引?

1 前言 现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是我们今天要讨论的问题。 假设&#xff0c;现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; mysql> create table SUser…

删除有序数组中的重复项 II[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个有序数组nums&#xff0c;请你原地删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用O(1)额…

jvm基础篇之垃圾回收[2](垃圾回收算法)

文章目录 版权声明垃圾回收算法核心思想垃圾回收算法的历史垃圾回收算法的评价标准垃圾分类算法分类标记清除算法核心思想标记清除算法优缺点 复制算法核心思想完整案例复制算法的优缺点 标记整理算法核心思想标记整理算法优缺点 分代垃圾回收算法arthas查看分代内存情况核心思…

stm32软件安装以及创建工程

文章目录 前言一、软件安装软件破解 二、创建工程三、创建项目创建组配置启动文件添加到组 为项目添加头文件路径创建源文件&#xff08;main函数文件&#xff09;使用寄存器配置引脚拼接好STLINK与stm32最小电路板的接线编写程序配置STLink下载程序配置寄存器配置13号端口&…

用户体验优化:HubSpot的秘密武器

在当今数字化市场中&#xff0c;提升用户体验已经成为企业成功的关键因素之一。HubSpot&#xff0c;作为一款领先的营销自动化工具&#xff0c;不仅在推动销售业绩上表现出色&#xff0c;同时通过其独特的策略也致力于提升用户体验。运营坛将深入探讨HubSpot是如何通过个性化推…

Leetcode—41. 缺失的第一个正数【困难】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—41. 缺失的第一个正数 实现代码 class Solution { public:int firstMissingPositive(vector<int>& nums) {int n nums.size();// nums[i] i 1;// nums[i] - 1 i;// nums[nums[i] - 1] nums[i];for(int …

能源管理新高度DI/DO/CAN/RS485/USB网关助力二次开发

能源管理领域正在寻求更为智能化和高效的解决方案。一款集成了先进ARM架构处理器的边缘计算能源储能网关应运而生&#xff0c;以其卓越的性能和丰富的接口功能吸引了众多行业用户的关注。 这款网关不仅配备有常规的数字输入&#xff08;DI&#xff09;、数字输出&#xff08;DO…

【简便方法和积累】pytest 单元测试框架中便捷安装插件和执行问题

又来进步一点点~~~ 背景&#xff1a;之前写了两篇关于pytest单元测试框架的文章&#xff0c;本篇内容对之前的做一个补充 一、pytest插件&#xff1a; pytest 有非常多的插件&#xff0c;很方便&#xff0c;以下为插件举例&#xff1a; pytest&#xff0c;pytest-html&#x…

新手从零开始学习数学建模论文写作(美赛论文临时抱佛脚篇)

本文记录于数学建模老哥视频的学习过程中。b站视频&#xff1a;http://【【零基础教程】老哥&#xff1a;数学建模算法、编程、写作和获奖指南全流程培训&#xff01;】https://www.bilibili.com/video/BV1kC4y1a7Ee?p50&vd_sourceff53a726c62f94eda5f615bd4a62c458 目录…

树型结构构建,模糊查询,过滤

一、前言 1、最近在做甘特图&#xff0c;有些需求和树型结构要求很大&#xff0c;看的是 pingCode&#xff0c;有搜索 2、还有抽取一部分树型结构的&#xff0c;如下是抽取上面的结构类型为需求的&#xff0c;重新组成树型 二、构建多颗树型结构 1、某些业务下&#xff0c;从…

C语言指针的几种用途

先看题目&#xff0c;写一个fun函数&#xff0c;统计一个字符串中某个字符出现的次数&#xff0c;以及这个字符第一次出现的位置。 看起来很简单&#xff0c;似乎几行就可以搞定&#xff0c;但是写出来之后&#xff0c;才发现代码怎么这么长&#xff01;程序里多处使用了指针&…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件&#xff1a;子组件A&#xff1a;子组件B&#xff1a;eventbus/index.js&#xff1a; EventBus的基本使用方法&#xff1a; 示例背景 在Vue中&#xff0c;使用EventBus可以实现组件…