CMakeList整理大全

0. CMake应用示例

之前我们也整理过cmake 引入第三方库(头文件目录、库目录、库文件)。但是这里面整理的内容其实是不全的。所以我们需要进一步将CMake的使用整理好。以供后面的学习的工程师来检索查询。

cmake-template
├── CMakeLists.txt
└── build
└── include
└── src└── main.cpp

1. CMakeList基础15例

# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.15)# 设置项目名称和版本
project(MyProject VERSION 1.0 DESCRIPTION "An example project with CMake")# 选项,可以通过-D在命令行定义
option(USE_CUSTOM_LIBRARY "Use a custom library" ON)# 定义条件预处理器宏
if(USE_CUSTOM_LIBRARY)add_definitions(-DUSE_CUSTOM_LIB)
endif()# 寻找外部依赖包
find_package(Threads REQUIRED)# 指定头文件的搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)# 指定库文件搜索路径
link_directories(${PROJECT_SOURCE_DIR}/libs)# 添加子目录,这些目录下也应该有自己的CMakeLists.txt
add_subdirectory(src)
add_subdirectory(libs)# 添加一个可执行文件
add_executable(myExecutable src/main.cpp)# 添加一个静态库
add_library(myStaticLib STATIC src/myStaticLib.cpp)# 添加一个动态库
add_library(mySharedLib SHARED src/mySharedLib.cpp)# 设置静态库和动态库的属性
set_target_properties(myStaticLib PROPERTIESARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/static_lib"
)
set_target_properties(mySharedLib PROPERTIESLIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/shared_lib"VERSION ${PROJECT_VERSION}
)# 设置可执行文件的属性
set_target_properties(myExecutable PROPERTIESRUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"OUTPUT_NAME "myExecutableFinal"
)# 指定链接库
target_link_libraries(myExecutable PRIVATE myStaticLib mySharedLib Threads::Threads)# 安装规则
install(TARGETS myExecutable myStaticLib mySharedLibRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION lib/static
)# 包含目录
target_include_directories(myExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)# 自定义命令和依赖
add_custom_target(runCOMMAND myExecutable
)
add_dependencies(run myExecutable)# 宏定义,用于打印消息
macro(print_details)message("Project details: ${PROJECT_NAME} version ${PROJECT_VERSION}")
endmacro()
print_details()# 文件操作示例
file(GLOB_RECURSE MY_SOURCES "src/*.cpp")
target_sources(myExecutable PRIVATE ${MY_SOURCES})# 配置文件生成
configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h)# 源文件目录搜索
aux_source_directory(. DIR_SRCS)
add_executable(myProgram ${DIR_SRCS})# 添加目录,引入其他项目
add_subdirectory(external)# 自定义目标,不产生输出文件
add_custom_target(CustomCommand ALLCOMMAND echo "Executing a custom command"COMMENT "This is a custom build step"
)# 文件复制命令
file(COPY ${CMAKE_SOURCE_DIR}/data.txt DESTINATION ${CMAKE_BINARY_DIR})

1.1 cmake_minimum_required

制定CMake的最小版本。它确保了 CMake 的特定版本或更高版本的特性能够被利用,并且保证了在旧版本的 CMake 中可能导致未知行为的特性不会被误用。

基本语法:

cmake_minimum_required(VERSION major.minor[.patch][.tweak] [FATAL_ERROR])
  • VERSION 关键字后面跟着所需的最低版本号。
  • FATAL_ERROR 是一个可选的参数,它在 CMake 的老版本中是必需的,如果用户使用的是比指定的 VERSION 更老的 CMake 版本,CMake 会报告一个致命错误并停止处理。在新版本的 CMake 中,默认情况下,如果版本不满足要求,CMake 就会报错并停止。

1.2 project

声明项目的名称和版本,并可选择指定支持的编程语言.此指令通常位于CMakeLists.txt文件的顶部,紧跟在cmake_minimum_required指令之后。

基本语法:

project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]][DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>][LANGUAGES <language-name>...])
  • <PROJECT-NAME> 是你的项目名称。
  • VERSION 关键字后面可以跟随项目的版本号。
  • DESCRIPTION可以添加项目描述。
  • HOMEPAGE_URL可以指定项目主页的URL。
  • LANGUAGES关键字后面可以跟一系列编程语言名称,例如 C, CXX (代表C++),CUDA,Fortran 等。如果不指定语言,CMake默认启用 C 和 CXX。

1.3 $$

CMake中的美元符号与括号一起使用,形如{...},用于引用变量的值。最常用的就是和project联系起来,例如:

基本语法:

# 设置项目名称和版本
project(MyProject VERSION 1.2.3 LANGUAGES CXX)
set(MY_VARIABLE "Hello, World")message("Project name: ${PROJECT_NAME}")
message("Project version: ${PROJECT_VERSION}")
message(${MY_VARIABLE})

$${MY_VARIABLE} 会被 CMake 替换为变量 MY_VARIABLE 的值.而project 指令将会创建一些变量,比如 PROJECT_NAMEPROJECT_VERSION 等,这些变量随后可以被引用。

1.4 set

在CMake中,set命令用于定义和修改变量。这个命令非常灵活,是CMake脚本中用得最频繁的指令之一,因为它可以用来存储各种类型的数据,如字符串、文件路径、列表(即字符串数组)、布尔值等。

基本语法:

set(<variable> <value> [CACHE <type> <docstring> [FORCE]])

<variable> 是你要设置的变量名。
<value> 是分配给变量的值。可以是一个或多个值(如果是多个值,它们会被视为一个列表)。
CACHE 选项用于将变量存储到CMake的缓存中,这对于可配置的选项很有用,因为它们在不同的构建中保持不变,除非被用户或者项目脚本修改。
<type> 指定缓存中的变量类型,如STRING、BOOL等。
<docstring> 是对变量的描述,通常出现在CMake GUI中。
FORCE 用于强制覆盖缓存中的值,即使用户已经设置了该值。

在 CMake 中,set 指令用于设置变量的值。它的基本语法如下:

set(my_variable "Hello, World!")
  1. 设置一个列表变量:
set(my_list 1 2 3 4 5)
  1. 设置一个缓存变量:
set(my_cached_variable  Release CACHE STRING "Set C++ Compiler Flags" FORCE) # Release or Debug# 取消缓存条目
unset(<variable> CACHE)

CMakeCache.txt文件用于存储缓存条目,第一次构建时会生成该文件,之后的构建并不会创建该文件。在引用缓存条目时,会去查找该文件,并返回值。

在使用 set()命令时,默认情况下,如果缓存条目在 CMakeCache.txt 文件不存在,会创建缓存条目,并写入到 CMakeCache.txt文件中。如果缓存条目在 CMakeCache.txt文件存在,忽略 set() 命令,不会覆盖现有的缓存条目。但是我们想强制覆盖现有的缓存条目,我们可以 FORCE 选项。

  1. 强制设置一个缓存变量:
set(my_cached_variable "Another value" CACHE STRING "Description of my_cached_variable" FORCE)

以上是 set 指令的基本语法和使用示例,你可以根据具体的需求设置不同类型的变量,如普通变量、列表变量或者缓存变量。

1.5 option

在 CMake 中,option 指令用于定义一个布尔类型的选项,这个选项可以用来控制编译过程中的一些行为或特性。基本语法如下:

基本语法:

option(<option_variable> "<help_string>" [initial_value])

其中:

  • <option_variable> 是要定义的选项的变量名。
  • "<help_string>" 是对选项的描述,会显示在 CMake GUI 或者命令行帮助信息中。
  • [initial_value] 是选项的初始值,可选,默认为 OFF

下面是定义一个开关选项,表示是否启用某个特性:

option(ENABLE_FEATURE "Enable some feature" ON)

1.6 add_definitions

在 CMake 中,add_definitions 指令用于向编译器添加预定义的宏定义。这些宏定义将在编译源文件时起作用。基本语法如下:

add_definitions(-D<macro1> [-D<macro2>] ...)

其中:

  • -D<macro> 表示要定义的宏,-D 后跟着宏的名称。如果宏需要带有值,则可以使用等号(=)将宏名称与值分隔开。

下面是一些 add_definitions 指令的使用示例:

  1. 定义一个简单的宏:
add_definitions(-DENABLE_LOGGING)
  1. 定义一个带有值的宏:
add_definitions(-DDEBUG_LEVEL=2)
  1. 定义多个宏:
add_definitions(-DENABLE_FEATURE_A -DENABLE_FEATURE_B)

通过 add_definitions 可以向编译器传递预定义的宏,这些宏在编译源文件时将起到作用。需要注意的是,使用 add_definitions 添加的宏定义将应用于整个项目中的所有源文件。

1.7 find_package

当使用 find_package 时,你需要指定要查找的软件包的名称,并可能需要提供版本信息和一些其他选项。以下是 find_package 的基本语法和详细使用例子:

基本语法:

find_package(<package_name> [version] [EXACT] [QUIET] [MODULE] [REQUIRED][COMPONENTS [components...]][OPTIONAL_COMPONENTS components...][NO_POLICY_SCOPE])

参数说明:

  • <package_name>: 要查找的软件包的名称。
  • version: 可选参数,用于指定软件包的版本。
  • EXACT: 可选参数,要求找到的软件包的版本必须与指定的版本完全匹配。
  • QUIET: 可选参数,如果找不到软件包不会产生错误消息。
  • MODULE: 可选参数,表示要查找的软件包是一个模块文件而不是一个软件包。
  • REQUIRED: 可选参数,表示找不到软件包时会产生错误消息并停止配置过程。
  • COMPONENTS [components...]: 可选参数,用于指定软件包的组件。
  • OPTIONAL_COMPONENTS components...: 可选参数,用于指定可选的软件包组件。
  • NO_POLICY_SCOPE: 可选参数,指示 CMake 不要修改 CMake 策略。

使用例子:

点击CMakeList整理大全 - 古月居 (guyuehome.com)可查看全文

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

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

相关文章

python中的argsort获取的是排好序的位置上原来元素的index

argsort 是许多编程语言中数组处理库的一个常见函数&#xff0c;用于返回数组中元素的索引&#xff0c;这些索引将数组的元素排序到升序位置。换句话说&#xff0c;argsort 不直接返回排序后的数组&#xff0c;而是返回原始数组中元素应该被放置的索引&#xff0c;以便生成排序…

【MyBatis-Plus LambdaQueryWrapper介绍】

文章目录 LambdaQueryWrapper 是什么&#xff1f;使用步骤1. 引入 MyBatis Plus 依赖2. 创建 LambdaQueryWrapper 对象3. 添加更多的查询条件4. 执行查询 示例代码 LambdaQueryWrapper 是什么&#xff1f; LambdaQueryWrapper 是 MyBatis Plus 中的一个查询条件构造器&#xf…

HarmonyOS Next开发学习手册——代码混淆

代码混淆简介 针对工程源码的混淆可以降低工程被破解攻击的风险&#xff0c;缩短代码的类与成员的名称&#xff0c;减小应用的大小。 DevEco Studio提供代码混淆的能力并默认开启&#xff0c;API 10及以上版本的Stage模型、 编译模式为release 时自动进行代码混淆。 使用约束…

沙龙圆满举行 | 数据资产入表新动向·驱动企业新质生产力!

近日&#xff0c;由四川智慧城市发展联盟、璞华科技有限公司等公司主办的“数据治理与入表专题沙龙会”在成都圆满落幕。璞华科技有限公司作为数据治理、数据资产入表领域的领军企业&#xff0c;为此次盛会贡献了我们的专业见解与实战经验。 沙龙现场&#xff0c;业内精英齐聚一…

后台管理系统通用表结构

后台管理系统的设计通常需要考虑以下几个关键的表&#xff1a; 用户表&#xff08;Users&#xff09;&#xff1a;存储用户信息&#xff0c;如用户名、密码、邮箱、手机号等。角色表&#xff08;Roles&#xff09;&#xff1a;定义系统中的不同角色&#xff0c;如管理员、普通…

【技术追踪】SDSeg:医学图像的 Stable Diffusion 分割(MICCAI-2024)

这医学图像分割领域啊&#xff0c;终究还是被 Stable Diffusion 闯进去了~ SDSeg&#xff1a;第一个基于 Stable Diffusion 的 latent 扩散医学图像分割模型&#xff0c;在五个不同医学影像模态的基准数据集上超越了现有的最先进方法~ 论文&#xff1a;Stable Diffusion Segmen…

基于LangChain构建RAG应用

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;上一篇文章中我们详细介绍了RAG的核心思想以及搭建向量数据库的完整过程&#xff1b;&#x1f632; 本文将基于上一篇文章的结果进行开发&#xff0c;主…

配置Nginx二级域名

一、环境 &#xff08;一&#xff09;配置 1.服务器 linux CentOS 2.反向代理 Nginx 3.开放端口 云服务器开放端口80和443 二、域名备案 &#xff08;一&#xff09;腾讯云 1.腾讯云域名备案流程 备注&#xff1a;一级域名备案后&#xff0c;二级域名可以不用再备案&a…

AS-V1000外部设备管理介绍(国标GB28181设备管理,可以管理的国标设备包括DVR/NVR、IPC、第三方国标28181平台)

目录 一、概述 1、视频监控平台介绍 2、外部设备定义&#xff08;接入的国标设备&#xff09; 二、外部设备管理 2.1 外部设备添加 &#xff08;1&#xff09;设备侧的配置 &#xff08;2&#xff09;平台侧的配置 2.2 外部设备信息的修改 三、外部通道管理 3.1 外部…

Java入门教程(上)

Java入门教程&#xff08;上&#xff09; Java是一种流行的面向对象编程语言&#xff0c;以其简洁、可移植和强大的特性&#xff0c;被广泛应用于各种软件开发领域。对于初学者来说&#xff0c;掌握Java的基础知识和编程技巧是非常重要的。本文将带你从零开始学习Java&#xf…

AI智能管理系统设计文档

AI智能管理系统设计文档 1. 引言 本设计文档旨在开发一套全面的AI智能管理系统&#xff0c;以优化生产运营效率和决策质量。该系统将利用先进的AI技术和数据分析能力&#xff0c;提供自动化流程控制、预测性维护、智能决策支持等功能。 2. 需求分析与目标设定 2.1 业务需求…

使用kubeadm安装k8s并部署应用

安装k8s 1. 准备机器 准备三台机器 192.168.136.104 master节点 192.168.136.105 worker节点 192.168.136.106 worker节点2. 安装前配置 1.基础环境 ######################################################################### #关闭防火墙&#xff1a; 如果是云服务器&…

React_创建一个项目

目录 一、React&#xff08;js 版&#xff09; 二、React&#xff08;ts 版&#xff09; 使用react创建一个项目,前提是确保你已经安装了Node.js和npm。 如果没有安装Node.js和npm&#xff0c;查看这个文件&#xff1a; 安装node.js和npmhttps://blog.csdn.net/zxy1993106…

志愿填报,院校优先还是专业优先?

1. 前言 24年高考帷幕落下&#xff0c;一场新的思考与选择悄然来临。对于每一位高考考生&#xff0c;学校和专业都是开启大学新生活的两个前置必选项。但有时候“鱼与熊掌不可兼得”&#xff0c;在分数受限的条件下&#xff0c;是选择一个心仪的专业还是选择一个知名度更高的学…

GoSync+华为智能穿戴使用指导

GoSync官方简介&#xff1a; GoSync 是一款免费应用程序&#xff0c;主要用于将您的可穿戴设备中的步行、跑步、骑自行车和游泳等活动数据同步到您的 Google Fit 和其他健身平台。在开始同步数据之前&#xff0c;您需要将您的可穿戴设备账户与您的健身平台账户连接起来。在创建…

三元和磷酸铁锂电池有什么区别?

现在的电动车大多都会使用到锂电池&#xff0c;在常见的锂电池分为两种&#xff0c;一种是三元锂电池另外一种是磷酸铁锂电池&#xff0c;面对这两种锂电池时&#xff0c;它们到底有什么不同&#xff1f; 1、材料不同 这两种锂电池的不同之处便是材料不同&#xff0c;磷酸铁锂…

时间序列分析入门:概念、模型与应用【ARMA、ARIMA模型】

在这篇博客中&#xff0c;我们将全面探讨时间序列分析的基本概念和分类&#xff0c;深入理解平稳性及其检验方法&#xff0c;并介绍自回归模型&#xff08;AR&#xff09;、滑动平均模型&#xff08;MA&#xff09;、自回归滑动平均模型&#xff08;ARMA&#xff09;以及自回归…

Unity免费领高级可视化编程自定义节点工具AI行为UI流程对话树状态机逻辑等FlowReactor价值50刀high level20240627

刚发现一款类似虚幻蓝图的可视化编程工具&#xff0c;原价50刀&#xff0c;现在免费领取了。赶紧去领取入库&#xff0c;防止作者涨价。 高级可视化编程自定义节点工具&#xff1a;https://prf.hn/l/BJbdvnD 作者其他资产&#xff1a;https://prf.hn/l/YLAYznV Unity免费领高级…

宿州市各区县科技服务机构备案和绩效评价申报材料条件和申报时间解答

一、宿州市各区县科技服务机构备案工作 &#xff08;一&#xff09;申报条件 1.以研发设计、创业孵化、技术转移、科技金融、知识产权、科技咨询、检验检测认证、科学技术普及等为主营业务&#xff0c;在宿州市注册的独立法人机构&#xff0c;登记注册时间不少于一年&#xf…

提取url中的参数

let url https://alibaba.com?a1&b2&c3#hash function queryUrlParams(URL){let url URL.split(?)[1];const urlSearchParams new URLSearchParams(url);console.log(url1, urlSearchParams);console.log(entries,urlSearchParams.entries())const params Object…