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.hqwc.cn/news/450136.html

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

相关文章

计算机网络自顶向下Wireshark labs-HTTP

我直接翻译并在题目下面直接下我的答案了。 1.基本HTTP GET/response交互 我们开始探索HTTP,方法是下载一个非常简单的HTML文件 非常短,并且不包含嵌入的对象。执行以下操作: 启动您的浏览器。启动Wireshark数据包嗅探器,如Wir…

【lesson8】高并发内存池Central Cache层释放内存的实现

文章目录 Central Cache层释放内存的流程Central Cache层释放内存的实现 Central Cache层释放内存的流程 当thread_cache过长或者线程销毁,则会将内存释放回central cache中的,释放回来时–use_count。当use_count减到0时则表示所有对象都回到了span&am…

[MFC] MFC消息机制的补充

之前写了[MFC] 消息映射机制的使用和原理浅析,还有些需要补充的,都记在这里。 MFC 消息的分类 MFC消息分为系统消息和自定义消息。 图片来源:C语言/C教程 大型源码案例分析:MFC消息系统的代码解析 易道云编程 系统消息分为窗口…

YOLOv5改进:下采样系列 |一种新颖的基于 Haar 小波的下采样HWD,有效涨点系列

💡💡💡本文独家改进:HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率,同时保留尽可能多的信息,与传统的下采样方法相比,有效降低信息不确定性。 💡💡💡使用方法:代替原始网络的conv,下采样过程中尽可能包括更多信息,从而提升检测精度。 收录 YO…

Python中的继承和super()

父类方法的调用 可以使用父类名.方法名来调用也可以使用super().方法名来调用 MRO顺序 Python官方采用了一个算法将复杂结构上所有的类全部都映射到一个线性顺序上,而根据这个顺序就能 够保证所有的类都会被构造一次。这个顺序就是MRO顺序。 查看MRO顺序 类名.…

【JavaWeb】头条新闻纯JavaWeb项目实现 项目搭建 数据库工具类导入 跨域问题 Postman 第一期 (前端Vue3+Vite)

文章目录 一、项目简介1.1 微头条业务简介1.2 技术栈介绍 二、项目部署三、准备工具类3.1 异步响应规范格式类3.2 MD5加密工具类3.3 JDBCUtil连接池工具类3.4 JwtHelper工具类3.4 JSON转换的WEBUtil工具类 四、准备各层的接口和实现类4.1 准备实体类和VO对象4.2 DAO层接口和实现…

Day17、18、19学习记录

#c语言知识 内存管理 1.作用域 (1)代码块作用域(代码块是{}之间的一段代码) (2)函数作用域 (3)文件作用域 2.局部变量(自动变量auto): 在函…

快速理解复杂系统组成学习内容整合

目录 一、复杂系统组成 二、接入系统 (Access System) 三、应用系统 (Application System) 四、基础平台 (Foundation Platform) 五、中间件 (Abundant External Middleware) 六、支撑系统 (Supporting System) 参考文章 一、复杂系统组成 复杂系统是由多个相互关联、相…

2024程序员就业咋办?

国际研究机构Gartner会在每年10月份左右发布下一年度的战略发展趋势预测,并在次年3月左右发布和网络安全相关的趋势预测。绿盟科技通过将近3年的趋势预测进行分组对比分析后发现,除了众人皆知的AI技术应用外,数据模块化、身份优先安全、行业云…

【Java程序设计】【C00207】基于(JavaWeb+SSM)的宠物领养管理系统(论文+PPT)

基于(JavaWebSSM)的宠物领养管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物领养系统 本系统分为前台系统、管理员、收养者和寄养者4个功能模块。 前台系统:游客打开系统…

AIGC时代企业与个人应该如何应对?

引言:AIGC是一种新兴的技术趋势,它正在为各个领域带来更多的创新和变革。未来,随着技术的不断进步和应用范围的扩大,AIGC的影响力还将不断增强。新时代下企业与个人应该如何应对呢? 1. 什么是AIGC? AIGC是…

[每日一题] 02.03 - 质因数分解

质因数分解 枚举到n的平方根(得包括平方根) 偶数去除 import math n int(input()) if n % 2 0:print(max(n // 2,2)) else:for i in range(3,int(math.sqrt(n)) 1,2):if n % i 0:print(max(n // i,i))