CMake构建学习笔记21-通用的CMake构建脚本

在之前使用CMake构建程序的脚本(CMake构建学习笔记-目录)中,大部分内容都有比较强的相似性,那么是不是可以这些相似的内容提取出来作为一个单独的脚本,在构建具体的程序的时候再去调用这个脚本呢?这样做的好处是如果构建的配置有什么变动,就不用每个程序的构建脚本都修改了,只用修改这个通用的脚本就可以了。

具体的脚本cmake-build.ps1如下,适用于PowerShell终端:

param([string]$SourceLocalPath,[string]$BuildDir,[string]$Generator,[string]$InstallDir,[string]$SymbolDir,[string[]]$PdbFiles,[hashtable]$CMakeCacheVariables,[bool]$MultiConfig = $false  # 控制是否使用多配置类型
)# 清除旧的构建目录
if (Test-Path $BuildDir) {Remove-Item -Path $BuildDir -Recurse -Force
}
New-Item -ItemType Directory -Path $BuildDir# 构建CMake命令行参数
$CMakeArgs = @("-B", "`"$BuildDir`"","-G", "`"$Generator`"","-A", "x64"
)if ($MultiConfig) {$CMakeArgs += "-DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo"
}
else {$CMakeArgs += "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
}$CMakeArgs += ("-DCMAKE_PREFIX_PATH=`"$InstallDir`"","-DCMAKE_INSTALL_PREFIX=`"$InstallDir`""
)# 添加额外的CMake缓存变量
foreach ($key in $CMakeCacheVariables.Keys) {$CMakeArgs += "-D$key=$($CMakeCacheVariables[$key])"
}# 配置CMake
cmake $SourceLocalPath $CMakeArgs# 构建阶段,指定构建类型
cmake --build $BuildDir --config RelWithDebInfo --parallel# 安装阶段,指定构建类型和安装目标
cmake --build $BuildDir --config RelWithDebInfo --target install# 复制符号库
foreach ($file in $PdbFiles) {  Write-Output $fileif (Test-Path $file) {Copy-Item -Path $file -Destination $SymbolDir}else {Write-Output "Warning: PDB file not found: $file"}
}# 清理构建目录
#Remove-Item -Path $BuildDir -Recurse -Force

这段脚本的关键在于以下几点:

  1. CMake配置参数$CMakeArgs。首先是通用配置,-B表示生成的目录;-G表示生成器,比如"Ninja"或者"Visual Studio 17 2022";-A表示目标平台的架构。然后是构建目标的类型,有的库使用CMAKE_CONFIGURATION_TYPES,有的库使用CMAKE_BUILD_TYPE,值设置成RelWithDebInfo表示Release版本,但是带调试信息。接下来是设置依赖库查找路径CMAKE_PREFIX_PATH和安装路径CMAKE_INSTALL_PREFIX。最后是添加额外的CMake缓存变量,这些缓存变量通常与要构建的库有关。
  2. 使用生成的配置参数$CMakeArgs进行项目配置:cmake $SourceLocalPath $CMakeArgs。这一步会把设置的参数固定成具体的项目参数,如果使用Visual Studio进行构建,就是生成sln项目。
  3. 编译、链接,生成构建目标:cmake --build $BuildDir --config RelWithDebInfo --parallel。这里的--parallel的意思是并行构建,会采用多线程的方式构建项目,自动决定线程数。
  4. 安装构建目标cmake --build $BuildDir --config RelWithDebInfo --target install
  5. 最后一步复制符号库的作用是将生成的符号库文件复制到特定的目录中进行管理,这样在程序崩溃之后,可以通过符号库找到相应的代码,便于进行错误排查。

那么有没有具体使用这个cmake-build.ps1脚本的例子呢?后续文章中的程序构建会使用这个脚本,敬请期待。

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

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

相关文章

无人机和无人系统的计算机视觉-人工智能无人机

无人机和无人系统的计算机视觉-人工智能无人机将计算机视觉与无人系统相结合,可以提升其自主或半自主执行复杂任务的能力。这些系统将图像数据与其他机载传感器(例如 GNSS/GPS、IMU、LiDAR 和热像仪)融合,以解读周围环境并执行精确…

【开题答辩全过程】以 基于hadoop架构的教学过程监控系统为例,包含答辩的问题和答案

个人简介:一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧…

坎坷基金路

2025年8月27日上午10:59从基金委官网上中外合作入口查到自己的基金中了。心情顿时五味杂陈,回想起写基金忙碌的9个月,各位专家对我的指导,嘴角楠楠的说:感恩。自己觉着比较重要的几个点:1、立意必须基于自己的过往研究…

[n8n]

docs:n8n工作流管理系统 本项目帮助管理和探索n8n工作流。 它能自动扫描和分析工作流文件,提取关键信息如名称、触发器和关联服务。 所有数据将存入可搜索的数据库,并通过REST API提供访问。 可以快速定位特定工作流、查看详细描述&#xff0…

[手写系列]Go手写db — — 第二版

[手写系列]Go手写db — — 第二版 第一版文章:[手写系列]Go手写db — — 完整教程 整体项目Github地址:https://github.com/ziyifast/ZiyiDB请大家多多支持,也欢迎大家star⭐️和共同维护这个项目~ 本文主要介绍如何在 ZiyiDB 第一版的基础上…

私有化大模型基础知识

私有化大模型基础知识 文章目录私有化大模型基础知识0x01.开源闭源2. 数据成本:昂贵且隐形的开销3. 研发投入:人力与时间成本总结:总成本量化更重要的是:持续投入和机会成本0x02.模型大小0x03.模型参数0x04.CPU和GPU0x05.GPU和模型…

Django时区处理

Django 的时区处理机制是为了确保在全球部署应用时,时间数据始终一致、可控,并能根据用户或系统需求灵活转换。下面我来系统地拆解一下 Django 的时区处理方式,帮你掌握从配置到实际应用的全过程。🧭 1. 基础配置:USE_…

SqlHelper类库的使用方法

使用 SqlHelper.dll 时,首先需要在项目中引用该 DLL,然后通过其封装的方法简化 SQL Server 数据库操作。以下是常见操作的 C# 示例代码:查看SqlHelper.dll方法内容// 替换为实际的SqlHelper.dll路径 using System.Reflection; using Microsof…

苍穹外卖项目实战(日记十一)-记录实战教程及问题的解决方法-(day3-3)完善菜品分页查询功能

菜品分页查询 (1)需求分析 (2)代码开发分析 DTO 前端给后端 ,VO 后端给前端; vo是进行页面展示,dto是前后端数据交互的,pojo是对应数据库表字段 (3)DishCo…

C++ 力扣 704.二分查找 基础二分查找 题解 每日一题

文章目录二分查找:从基础原理到代码实现二分查找的特点:细节是坑,学会是宝算法重点:原理不只是“有序”,模板要懂不要背题目描述:LeetCode 704. 二分查找为什么这道题值得弄懂?为什么可以用二分…

VLN通用评测管线设计

我来用图形化的方式清晰地展示整个多模型适配的架构和流程: 效果视图 #mermaid-svg-1UJ7Kg2nY4JE9Ncs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1UJ7Kg2nY4JE9Ncs .error-icon{fill:#552222;}#merm…

aiohttp模块如何使用

aiohttp 简介aiohttp 是一个基于 Python 的异步 HTTP 客户端/服务器框架,构建于 asyncio 之上。它支持高性能的异步网络操作,适用于 Web 服务、爬虫、API 调用等场景。核心功能HTTP 客户端:支持异步发送 HTTP 请求,处理响应。HTTP…

ModuleNotFoundError: No module named ‘dbgpt_app‘

问题原因:这个问题的核心是Python的模块导入机制。即使能看到dbgpt_app目录,但Python解释器可能找不到它,这是因为Python需要知道去哪里查找这个模块。让我用简单的语言解释一下: Python的模块搜索路径 Python解释器在导入模块时&…

死锁产生的条件是什么? 如何进行死锁诊断?

1. 死锁产生的条件是什么?一个线程需要同时获取多把锁,这时就容易发生死锁2. 如何进行死锁诊断?当程序出现了死锁现象,我们可以使用jdk自带的工具:jps和jstackjps:输出JVM中运行的进程状态信息jstack:查看java进程内线程的堆栈信息,查看日志,检查是否有死锁,如果有…

【科研绘图系列】R语言在海洋生态学数据可视化中的应用:以浮游植物叶绿素和初级生产力为例

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 数据准备 数据处理 叶绿素含量(Chl:C)随年龄的变化 初级生产力(NPP)随年龄的变化 数据可视化 加载R包 数据下载 导入数据 数据预处理 画图 保持图片 总结 系统信息 介绍 本教…

【Qt开发】常用控件(七)-> styleSheet

目录 1 -> 引言:为什么需要 Qt 样式表? 2 -> Qt 样式表基础 2.1 -> 什么是 Qt 样式表 2.2 -> 基本语法结构 3 -> 选择器类型 3.1 -> 通用选择器 3.2 -> 类型选择器 3.3 -> 类选择器 3.4 -> ID 选择器(通…

linux 正则表达式学习

本篇主要学习几个正则表达式匹配符&#xff1a; ^&#xff1a;锚定行首$&#xff1a;锚定行尾\< 或者 \b&#xff1a;锚定词首\>或者 \b&#xff1a;锚定词尾\B&#xff1a;匹配”非单词边界” 下面通过实验彻底掌握&#xff1a; 测试文件内容如下&#xff1a; cat test.…

MIPS汇编快速入门 【龙芯】

一、前言&#xff1a;MIPS与龙芯的渊源 MIPS&#xff08;Microprocessor without Interlocked Pipelined Stages&#xff09;是一种经典的RISC&#xff08;精简指令集&#xff09;架构&#xff0c;以流水线高效、指令简洁、低功耗为特点。龙芯&#xff08;Loongson&#xff09;…

如何对springboot mapper 编写单元测试

如何对springboot mapper 编写单元测试在 Spring Boot 中对 MyBatis Mapper 编写单元测试的核心目标是​​隔离真实数据库依赖​​&#xff0c;验证 SQL 逻辑与数据库交互的正确性。以下是完整的实践指南&#xff0c;涵盖环境配置、测试数据初始化、具体测试用例编写及常见问题…

学习游戏制作记录(数据加密以及主菜单和画面优化)8.27

1.实现数据加密FileDataHandler 脚本&#xff1a;private bool encryptData false;//是否加密public string codeWord "alexdev";//加密码public FileDataHandler(string _dataDirPath, string _fileName, bool _encryptData){dataDirPath _dataDirPath;FileName …