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 $file
if (Test-Path $file) {
Copy-Item -Path $file -Destination $SymbolDir
}
else {
Write-Output "Warning: PDB file not found: $file"
}
}
# 清理构建目录
#Remove-Item -Path $BuildDir -Recurse -Force
这段脚本的关键在于以下几点:
- 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缓存变量,这些缓存变量通常与要构建的库有关。 - 使用生成的配置参数
$CMakeArgs进行项目配置:cmake $SourceLocalPath $CMakeArgs。这一步会把设置的参数固定成具体的项目参数,如果使用Visual Studio进行构建,就是生成sln项目。 - 编译、链接,生成构建目标:
cmake --build $BuildDir --config RelWithDebInfo --parallel。这里的--parallel的意思是并行构建,会采用多线程的方式构建项目,自动决定线程数。 - 安装构建目标
cmake --build $BuildDir --config RelWithDebInfo --target install。 - 最后一步复制符号库的作用是将生成的符号库文件复制到特定的目录中进行管理,这样在程序崩溃之后,可以通过符号库找到相应的代码,便于进行错误排查。
那么有没有具体使用这个cmake-build.ps1脚本的例子呢?后续文章中的程序构建会使用这个脚本,敬请期待。
CMake构建学习笔记21-通用的CMake构建脚本的更多相关文章
- SQL反模式学习笔记21 SQL注入
目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...
- Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)
Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ...
- CMake学习笔记一:初识cmake
1 cmake简介 1.1 背景知识 cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目.项目的诞生时间是 2 ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- matlab学习笔记10_5 通用字符串操作和比较函数
一起来学matlab-matlab学习笔记10 10_5 通用字符串操作和比较函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张 ...
- ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】
有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...
- [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总
本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...
- Bash脚本编程学习笔记05:用户交互与脚本调试
用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...
- Redis学习笔记(三)使用Lua脚本实现分布式锁
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 使用Lua脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放 ...
随机推荐
- 给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(下)
1 引言 在上一篇文章<给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(上)>中笔者介绍了如何实现在Markdown渲染网页中加一个目录组件.不 ...
- 数栈技术分享:开源·数栈-扩展FlinkSQL实现流与维表的join
一.扩展FlinkSQL实现流与维表的join 二.为什么要扩展FlinkSQL? 1.实时计算需要完全SQL化 SQL是数据处理中使用最广泛的语言.它允许用户简明扼要地声明他们的业务逻辑.大数据 ...
- 数栈技术分享前端篇:TS,看你哪里逃~
数栈是-站式大数据开发平台,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变化的数据 ...
- 1-python中的两大法宝和加载数据
python中的两大法宝和加载数据 1. Python两大法宝 ① Python3.6.3相当于一个package,package里面有不同的区域,不同的区域有不同的工具. ② Python语法有两大 ...
- 特殊恢复:oradebug推进Linux平台SCN的值
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...
- Luogu P8479 「GLR-R3」谷雨
题传 upd on 2023.10.03 补充了代码以及一些实现细节. 自己写的关于这类剖分方法的 \(blog\) 题意简述 称一条链和与其有连边的点 构成的点集 为 "毛毛虫" ...
- iga 入门之 区域剖分
简介 摘自 流体力学数值方法 detail 区域剖分是有限元方法在编写程序之前进行准备工作的重要一步,工作量较大. 完成如下几项 单元划分,确定结点 将求解区域(也就是积分表达式中的几分区域)划分成若 ...
- 产品更新丨谷云科技ETLCloud 3.9.3 版本发布
在数字化集成领域不断探索创新的谷云科技,为持续提升 ETLCloud 集成平台的性能和用户体验,于近期发布了 3.9.3 版本.本次迭代带来了新功能.对现有组件进行了优化,同时修复了多个影响系统稳定性 ...
- 销帮帮CRM与电商运营增效的关系?
在电商运营中,不同部门之间往往存在信息壁垒,导致客户体验的不连贯.销帮帮CRM通过提供跨职能管理客户关系的共享平台和一体化工作流引擎,使员工能够使用正确的工具和数据更有效地管理跨业务线的客户关系,实现 ...
- POLIR-Society-Organization-Psychology-Relationship关系-Feelings感觉: Relationship Emotions : How to Express Feelings in a Relationship
https://www.verywellmind.com/feeling-words-to-help-spouse-2300571 Relationships > Strengthening R ...