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.mfbz.cn/a/366805.html

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

相关文章

gRPC使用详解

起源特点主要优缺点应用场景组成部分使用方法SpringBoot集成gRPCVert.x集成gRPCNacos集成gRPC监控gRPC调用过程Java使用示例 起源 gRPC的起源可以追溯到2015年,当时谷歌发布了一款开源RPC框架,名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨…

excel统计分析——卡方独立性检验(下)

参考资料:生物统计学 书接上文:https://blog.csdn.net/maizeman126/article/details/135893731 2、配对列联表 配对设计的数据,进行列联表检验时,采用McNemar-Bowker检验法进行检验。检验统计量为: 自由度dfk(k-1)/2…

CSS是一门需要单独学习的技术吗?

CSS (Cascading Style Sheets) ,做前端开发的人都很清楚,因为这是他们的一项必不可少的技能。我以前也是知道CSS,但从来没有单独学习过,认为就它只是用来渲染网页的表现层效果,定制页面和内元素的布局、颜色和字体等&a…

python 蓝桥杯处理各种输入的数据

文章目录 空格间隔提取数字 空格间隔提取数字 对于以空格间隔的数字,由于输入的形式是字符串,那么就可以使用split 函数进行对输入的一个分隔,然后利用split 函数返回的是分隔之后的一个列表,再利用下标对于每一个部分进行相对应的…

C++学习Day01之C++对C语言增强和扩展

目录 一、程序及输出1.1 全局变量检测增强1.2 函数检测增强1.3 类型转换检测增强1.4 struct增强1.5 bool类型扩展1.6 三目运算符增强1.7 const增强1.7.1 全局Const对比1.7.2 局部Const对比1.7.3 Const变量初始化数组1.7.3 Const修饰变量的链接性 二、分析总结 一、程序及输出 …

Linux——存储管理

文章目录 基本分区磁盘简介磁盘分类linux的磁盘命名磁盘的分区方式 管理磁盘虚拟机添加硬盘查看磁盘信息磁盘分区流程创建分区创建文件系统挂载mount查看挂载信息 剩余空间继续分区MBR如何划分更多的分区为什么只能有4个主分区扩展分区的引入 逻辑卷LVM是什么特点术语创建LVMVG…

算法40:线段树 + 懒更新

线段树:一种支持范围整体修改和范围整体查询的数据结构 解决的问题范畴: 大范围信息可以只由左、右两侧信息加工出, 而不必遍历左右两个子范围的具体状况。 白话版解释就是:针对数组可以范围进行修改和查询。 假设,一…

云原生 API 网关链路追踪能力重磅上线

云原生API网关介绍 云原生 API 网关是腾讯云基于开源网关推出的一款高性能高可用的云原生 API 网关产品,作为云上流量入口,集成请求分发、API 管理、流量监控、访问限制等功能,是微服务架构和容器架构中的重要组件。 TSE 云原生 API 网关提…

蓝桥杯-常用STL(二)

常用STL 🎈1.集合🎈2.set的基础使用🔭2.1引入库🔭2.2插入元素🔭2.3删除元素🔭2.4判断元素是否存在🔭2.5遍历元素🔭2.6清空 🎈3.set与结构体 🎈1.集合 &#x…

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile。 scope的分类 compile(默认) 含义: compile 是默认值,如果没有指定 scope 值,该元素…

【C语言刷题系列】喝汽水问题

文章目录 一、文章简介 1.先买再换 1.1 代码逻辑: 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑: 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

15个好的在线课程细分市场(+真实MemberPress网站案例)

开发和销售在线课程可能是一种很好的谋生方式。借助市场上的课程插件&#xff0c;您甚至不必成为网页设计或开发方面的专家即可创建高端虚拟学习体验。 为了让您的在线课程有一个良好的开端&#xff0c;您需要对其定位进行一些思考。这可能感觉像是一个压倒性的决定&#xff0…

IDEA 配置和缓存目录 设置

IDEA系列产品&#xff0c;一般会在用户目录创建 配置 和 缓存 目录&#xff1a; %APPDATA%\JetBrains%LOCALAPPDATA%\JetBrains 一般会展示为&#xff1a; C:\Users\<username>\AppData\Roaming\JetBrainsC:\Users\<username>\AppData\Local\JetBrains 一般占用…

在 Windows 10 上使用 Visual Studio 2022 进行 C++ 桌面开发

工具下载链接&#xff1a;https://pan.quark.cn/s/c70b23901ccb 环境介绍 在今天的快速发展的软件开发行业中&#xff0c;选择合适的开发环境是非常关键的一步。对于C开发人员来说&#xff0c;Visual Studio 2022&#xff08;VS2022&#xff09;是一个强大的集成开发环境&…

手机云控制发电机组 有网络随时随地操控监控运行

GenCloudTM 发电机组云控系统简介 Ver2.0 目录 公司简介…… …………………………… ………………………………………………1概 述…… …………………………… ………………………………………………1主要功能及特点………… …………… ………… ………………………………

卡密社区SUP系统总控源码+主站分销系统功能源码

卡密社区SUP系统总控源码主站分销系统功能源码 跟以前的卡盟那种控制端差不多总控可以给别人开通&#xff0c;分销&#xff0c;主站&#xff0c;类似自己做系统商一样&#xff0c;自助发卡&#xff0c;卡密交易系统。 搭建环境Nginx1.22 mysql 5.7 php8.1 rids 7.2 安装方法…

深入理解 Golang 的 crypto/elliptic:椭圆曲线密码学的实践指南

深入理解 Golang 的 crypto/elliptic&#xff1a;椭圆曲线密码学的实践指南 引言crypto/elliptic 库概览基本使用教程高级应用案例性能与安全考量结论 引言 在当今数字时代&#xff0c;数据安全和加密技术成为了信息技术领域的重中之重。特别是在网络通信和数据存储领域&#…

unity3d的海盗王白银城演示

这是一个外网上的下载的海盗王unity3d制作的白银城演示场景。 地图只含有白银城区&#xff0c;没有野外和怪物。 当然也没有服务器端的。 我对灯光、摄像头、天空背景等做过调整&#xff0c;使它显示起来比较鲜丽。 它的模型和贴图是直接拿了海盗的&#xff0c;没有做过优化调整…

04 模块基础 隐藏模块

文章目录 PRE.内核中的内核模块&#xff1a;module 结构体Step-I. /proc/modules 信息隐藏Step-II. /sys/module/ 信息隐藏 当我们将一个 LKM 装载到内核模块中之后&#xff0c;用户尤其是服务器管理员可以使用 lsmod 命令 发现你在服务器上留下的rootkit arttnba3ubuntu:~/D…
最新文章