Inno Setup打包的Cygwin编译C++程序因ca-bundle.crt无法运行如何解决
问题成因
你遇到的问题根因是Cygwin运行时对带有Windows系统(S)属性的文件的特殊处理逻辑:Cygwin模拟POSIX文件系统时,会默认将带有Windows系统属性的文件识别为特殊系统文件,不会作为普通用户文件读取,所以你的程序运行时无法读取带S属性的ca-bundle.crt证书文件,导致启动失败。
安装后的文件多出S属性,是Inno Setup默认在解压安装文件到系统程序目录时,为部分携带特殊元数据的文件自动附加的属性,手动复制的文件不会继承该属性,所以替换后程序可以正常运行。
修复方案
你可以任选以下任意一种方案修改Inno Setup脚本,重新打包即可解决问题:
方案1:安装后自动移除文件系统属性
在脚本末尾添加[Run]段条目,安装完成后自动执行命令移除证书文件的系统属性,该方案兼容性最高:
[Run] Filename: "attrib.exe"; Parameters: "-S ""{app}\etc\pki\tls\certs\ca-bundle.crt"""; Flags: runhidden
如果你需要批量处理etc目录下所有可能带S属性的文件,可以将参数修改为:
Parameters: "-S /S ""{app}\etc\*"""
方案2:禁止Inno Setup为文件添加系统属性
修改etc目录对应Files条目,在Flags参数中增加dontsetntfsattributes,让Inno Setup安装时保留源文件的原始属性:
Source: "C:\Users\xxxx\Desktop\cryptoProfit\etc\*"; DestDir: "{app}\etc"; Flags: ignoreversion recursesubdirs createallsubdirs dontsetntfsattributes
内容的提问来源于stack exchange,提问作者eNkkk
相关产品推荐
相关产品推荐

