如何向CMake CPack NSIS Windows安装包添加含超260字符长路径文件的目录
CPack NSIS打包长路径报错修复方案
问题本质
Windows默认对Win32路径有260字符长度限制,CPack生成NSIS安装包时,会先把待安装文件拷贝到build目录下层级很深的_CPack_Packages/win64/NSIS/临时目录,临时目录前缀+待打包文件的相对路径总长度很容易突破260字符阈值,触发NSIS failed opening file报错。
可落地方案(按优先级排序)
- 方案1:配置短路径临时打包目录(优先使用,无额外依赖)
在CMake配置中添加如下参数,指定NSIS打包时用磁盘根目录下的短路径作为临时暂存目录,从根源上缩短路径总长度:
修改后重新执行CMake配置、再运行# 路径可自定义,保证层级浅、无空格、总长度短即可 set(CPACK_NSIS_STAGING_PREFIX "C:/cpk_tmp")cpack -C Release即可,不需要改系统设置、不需要升级工具,90%以上的场景可以直接解决问题。 - 方案2:开启NSIS+系统长路径支持
如果待打包文件本身的相对层级就极深,改短临时路径后总长度还是超限,可以升级NSIS到3.08及以上版本,同时完成两项配置:- 在Windows系统开启长路径支持:打开本地组策略编辑器,依次进入「计算机配置-管理模板-系统-文件系统」,将「启用Win32长路径」设置为已启用,重启系统生效。
- 在CMake配置中添加NSIS长路径启用参数:
set(CPACK_NSIS_DEFINES "!define LONG_PATHS_ENABLE 1")
- 方案3:调整安装路径规则
如果CI/生产环境没法改系统设置、也没法升级NSIS,可以直接调整install指令的目标路径,减少目录层级;或者提前把深层级的目录打包成压缩包,在安装阶段执行解压逻辑,从根源上降低单条路径的长度。
避坑提示:不要靠手动把build目录挪到短路径的方式临时解决,换构建环境、CI工作目录路径变化后问题会复现,一定要把配置固化到CMake脚本里。
内容的提问来源于stack exchange,提问作者Andrii Rallo
相关产品推荐
相关产品推荐

