为Windows编译带管理员权限清单的Rust程序时清单未生效求解
解决Rust GNU工具链下Windows清单不生效的问题
问题原因
你使用的是i686-pc-windows-gnu目标(GNU工具链),而[package.metadata.win]是针对MSVC工具链的专属配置,GNU工具链不会读取该选项,导致清单文件未被嵌入到最终生成的可执行文件中。
方法一:手动用windres编译清单(无需额外依赖)
- 编写资源脚本文件
app.rc,内容如下:
1 24 "app.manifest"
(注:1为资源ID,24是RT_MANIFEST资源类型的数值,直接关联你的清单文件)
- 用GNU工具链的
windres工具将.rc文件编译为.o目标文件:
windres -i app.rc -o app.o --target=pe-i386
(--target=pe-i386对应x86平台,确保与编译目标匹配)
- 在Cargo.toml中添加链接配置,告知Cargo链接生成的
.o文件:
[target.i686-pc-windows-gnu.build] rustflags = ["-C", "link-arg=app.o"]
- 重新执行编译命令:
cargo build --release --target=i686-pc-windows-gnu
方法二:使用cargo-windows-manifest工具(自动化方式)
- 安装该cargo子命令:
cargo install cargo-windows-manifest
- 确保
app.manifest在项目根目录,执行编译时附加子命令:
cargo windows-manifest build --release --target=i686-pc-windows-gnu
该工具兼容GNU和MSVC工具链,会自动完成清单嵌入操作。
验证清单是否生效
编译完成后,右键生成的exe文件→属性→兼容性,查看"以管理员身份运行此程序"选项是否被锁定为勾选状态,或者直接运行exe,确认是否弹出UAC权限请求窗口。
内容的提问来源于stack exchange,提问作者Nayrosk
相关产品推荐
相关产品推荐

