【CMake 入门与进阶(7)】 CMakeLists.txt 部分常用变量-续(附使用代码)

news2024/12/22 17:27:52

        继续来学习CMakeLists.txt 常用变量

描述系统的变量

        顾名思义,这些变量描述了系统相关的一些信息:

变量说明
CMAKE_HOST_SYSTEM_NAME运行 cmake 的操作系统的名称(其实就是 uname -s)
CMAKE_HOST_SYSTEM_PROCESSOR运行 cmake 的操作系统的处理器名称(uname -p)
CMAKE_HOST_SYSTEM运行 cmake 的操作系统(复合信息)
CMAKE_HOST_SYSTEM_VERSION运行 cmake 的操作系统的版本号(uname -r)
CMAKE_HOST_UNIX如果运行 cmake 的操作系统是 UNIX 和类 UNIX,则该变量为 true,否则是空值
CMAKE_HOST_WIN32如果运行 cmake 的操作系统是 Windows,则该变量为 true,否则是空值
CMAKE_SYSTEM_NAME目标主机操作系统的名称
CMAKE_SYSTEM_PROCESSOR目标主机的处理器名称
CMAKE_SYSTEM目标主机的操作系统(复合信息)
CMAKE_SYSTEM_VERSION目标主机操作系统的版本号
ENV用于访问环境变量
UNIX与 CMAKE_HOST_UNIX 等价
WIN32与 CMAKE_HOST_WIN32 等价
  • CMAKE_HOST_SYSTEM_NAME、CMAKE_HOST_SYSTEM_PROCESSOR 、 CMAKE_HOST_SYSTEM 和 CMAKE_HOST_SYSTEM_VERSION

        这四个变量描述的是运行 cmake 的主机相关的信息,我们直接打印出来看看即可:

# 打印信息
message(${CMAKE_HOST_SYSTEM_NAME})
message(${CMAKE_HOST_SYSTEM_PROCESSOR})
message(${CMAKE_HOST_SYSTEM})
message(${CMAKE_HOST_SYSTEM_VERSION})

        对应的打印信息如下:

         大家自己对照一看就知道了,笔者就不再多说了。

  • CMAKE_SYSTEM_NAME 、 CMAKE_SYSTEM_PROCESSOR 、 CMAKE_SYSTEM 和 CMAKE_SYSTEM_VERSION

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

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

        cmake 打印信息如下:

         因为我们并没有对 cmake 配置交叉编译,默认会使用 Ubuntu 系统(运行 cmake 的主机)本身的编译工具,所以生成的目标文件(可执行文件或库文件)只能运行在 Ubuntu 系统中,所以这 4 个变量记录的依然是 Ubuntu 主机的信息。

  • ENV

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

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

        通过$ENV{XXX}访问 XXX 环境变量,我们来测试一下,首先在 Ubuntu 系统下使用 export 命令导出 XXX 环境变量:

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

        打印信息如下所示:

         从打印信息可知,ENV 变量确实可以访问到 Linux 系统的环境变量。

控制编译的变量

        这些变量可以控制编译过程,具体如下所示:

变量说明
EXECUTABLE_OUTPUT_PATH可执行程序的输出路径
LIBRARY_OUTPUT_PATH库文件的输出路径

        这两个变量前面我们已经用到过了,分别用来设置可执行文件的输出目录以及库文件的输出目录,接下来我们进行简单地测试。 譬如工程目录结构如下所示:

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

        hello.c 会被编译成动态库文件 libhello.so,而 main.c 会被编译成可执行程序,main.c 源码中调用了 hello.c 提供的函数;顶层 CMakeLists.txt 文件内容如下所示:

# 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目录下,执行cmake、make进行构建、编译,最终会生成可执行文件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/643364.html

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

相关文章

Android协程

协程 文章目录 协程1.讲协程之前的一些相关概念1.并发与并行2.同步与异步3.阻塞3.1Looper的阻塞3.1.1 loop的源码3.1.2loopOnce源码3.1.3注意 3.2Looper处于死循环是否会导致ANR3.2.1ANR是什么3.2.2Looper的死循环是否会导致ANR3.2.3总结 4.挂起4.1阻塞和挂起的区别 5.多任务 2…

pytorch深度学习框架—torch.nn模块(二)

pytorch深度学习框架—torch.nn模块(二) 激活函数 pytorch中提供了十几种激活函数,常见的激活函数通常为S形激活函数(Sigmoid)双曲正切激活函数(Tanh) 和线性修正单元(ReLu)激活函数等 层对应的…

Material—— RBD(Houdini To UE)

Houdini刚体碎块导入UE,有两个方面需还原,一是材质还原,一是动态还原; 一,ABC to UE 材质方面,Houdini里的每个Primtive Group属性,都表示UE内的对应材质球;导入时勾选Find Material…

AST使用(一)

关于安装及环境配置可以看https://mp.csdn.net/mp_blog/creation/editor/131155968 下面所有案例的JS原代码如下&#xff1a; const a 3; let string "hello"; for (let i 0;i < 3;i){string "world" } console.log("string",string) …

深度学习QA之卷积神经网络

深度学习Q&A之卷积神经网络 前言1 卷积基础知识问题1 简述卷积的基本操作&#xff0c;并分析其与全连接层的区别 &#xff08;难度&#xff1a; ★ \bigstar ★&#xff09;分析与解答&#xff1a; ♣ \clubsuit ♣ 局部连接: ♣ \clubsuit ♣ 权值共享: ♣ \clubsuit ♣ 输…

ubuntu 20.04 aarch64 平台交叉编译 opencv

编译环境 win10 64 位 VMware Workstation Pro 16 虚拟机 虚拟机安装 ubuntu 20.04 opencv 版本&#xff1a; 来自 github 当前最新 4.7 目的 交叉编译 opencv&#xff0c;用于 嵌入式 aarch64 平台 下载 opencv 可以直接从 github 下载 release 版本或者 使用 git clon…

『2023北京智源大会』6月9日上午|开幕式及全体大会

『2023北京智源大会』6月9日上午|开幕式及全体大会 文章目录 一. 黄铁军丨智源研究院院长1. 大语言模型2. 大语言模型评测体系FlagEval3. 大语言模型生态(软硬件)4. 三大路线通向 AGI(另外2条路径) 二. Towards Machines that can Learn, Reason, and Plan(杨立昆丨图灵奖得主…

Spring Boot整合JPA

文章目录 一、Spring Boot整合JPA&#xff08;一&#xff09;创建Spring Boot项目JPADemo&#xff08;二&#xff09;创建ORM实体类1、创建评论实体类 - Comment2、创建文章实体类 - Article &#xff08;三&#xff09;创建自定义JpaRepository接口 - ArticleRepository&#…

【Flutter】Flutter 中处理 loading 状态

文章目录 一、引言二、在 Flutter 中处理 loading 状态三、用具体业务逻辑代码示例展示四、常见问题及解决方案五、结语 一、引言 今天我们将一起探讨在 Flutter 中如何控制 loading 状态。 Flutter&#xff0c;作为一个高效、简洁的 UI 框架&#xff0c;已经在全球范围内得到…

FPGA基础知识-数据流建模

目录 学习目标 学习内容 1.门的类型 2.门延迟 学习时间 学习小结 学习目标 学习Verilog 提供的门级原语 理解门的实例引用、门的符号以及andor&#xff0c;bufnot类型的门的真值表 学习如何根据电路的逻辑图来生成verilog描述 讲述门级设计中的上升、下降和关断延迟 …

【MyBatis学习】MyBatis操纵数据库进行查询操作 ?MyBatis与JDBC想比怎么样,赶快与我一起探索吧 ! ! !

前言: 大家好,我是良辰丫,从今天开始我们就要进入MyBatis的学习了,请君与我一起操纵数据库,MyBatis到底是什么呢?我们慢慢往下瞧! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&#xff1a;javaEE进阶篇之…

前端——自定义组件

目录 一、创作纪念日——6月7日&#xff08;机缘巧合&#xff09; 二、收获 三、前端组件 3.1、重要的CSS 3.2、实用组件 1、站点访问次数 2、鼠标样式 3、烟花点击特效 4、GIF动态小人&#xff08;出现在左下角&#xff09; 5、天气插件 6、音乐播放器 3.3、CSS组…

leetcode337. 打家劫舍 III(java)

打家劫舍 leetcode337. 打家劫舍 III题目描述 暴力递归解题思路代码演示 递归加缓存代码演示 动态规划专题 leetcode337. 打家劫舍 III 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/house-robber-iii 题目描述 小偷又…

湖南大学CS-2019期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 一. 填空题(10 分,每空 2 分) 1. 0xb1e56f07 存放在采用小端存储的机器上,地址为 0x3287 到 0x328a ,则 0x3288 处存…

远程仓库拉不下来怎么办

因为项目需要做一个word转pdf的功能, 当我想要从阿里的仓库引入依赖时发现版本一直报错,无论怎么引入都爆红😭😭 *我将aspose的包先下载到本地,然后再安装安装到本地的maven仓库* mvn install:install-file -Dfile=C:\Users\Administrator\Downloads\aspose-words-18.…

Day01 项目简介分布式基础概念 -谷粒商城

最近在改进公司开发的商城项目&#xff0c;看到了尚硅谷的谷粒商城&#xff0c;就快速学习了下&#xff0c;因为之前的Kafka,Redis都是在这学习的&#xff0c;还有大数据的Flink。所以感觉一定不错&#xff0c;就开始了。 这里做一下学习笔记 一、项目简介 1 、项目背景 1 &…

一文看懂分布式存储 Ceph 架构原理

【摘要】本文带你层层深入Ceph的架构原理、读写原理&#xff0c;从而理解Ceph的特性及其应用场景。 1. 什么是Ceph&#xff1f; 首先&#xff0c;我们从 Ceph的官方网站上&#xff0c;可以看到&#xff1a;“Ceph is a unified, distributed storage system designed for exc…

第六章volatile详解

文章目录 volatile修饰的变量有2大特点volatile的内存语义 内存屏障是什么内存屏障分类粗分两种细分四种 什么叫保证有序性happens-before之volatile变量规则JMM就将内存屏障插入策略分为4种规则 volatile特性如何保证可见性说明例子volatile变量的读写过程 为何没有原子性例子…

软件测试“学历低”?10条人生逆袭建议

最近有粉丝私信问我“我学历低&#xff0c;投的简历屡屡石沉大海&#xff0c;不知道该怎么办&#xff1f;”之前也回答过其他人&#xff0c;今天把我的建议整理分享给大家。 学历是一块敲门砖&#xff0c;它会影响毕业以后的我们相当长一段时间&#xff0c;但并不是决定了我们…

fiddler抓包番外————了解工具栏

前言 作为一款功能强大的工具&#xff0c;Fiddler 提供了许多实用的功能和工具栏&#xff0c;可以帮助用户更加高效地使用它。 如果您想了解 Fiddler 的工具栏及其功能&#xff0c;那么本篇文章就是为您准备的。 在这里&#xff0c;我将为大家详细介绍 Fiddler 的工具栏及其…