Rust中如何实现类似#pragma comment(linker,...)的链接器选项配置
Rust中指定链接器选项实现类C/C++
#pragma comment(linker, ...) 功能 错误原因说明
你之前使用的#[link_section]属性作用是 标记单个函数/静态变量存放的目标段,并非向链接器传递全局配置参数。将链接参数写入该属性时,链接器会直接把参数字符串识别为自定义段名创建新段,自然无法达到预期效果。
另外你给出的原始pragma示例中段名带多余空格(. data/. rdata)属于笔误,实际MSVC链接器识别的段名是.data、.rdata、.text,配置时不要带多余空格。
正确实现方案
稳定版通用方案:build.rs脚本传参
所有Rust稳定版本都支持通过构建脚本向rustc传递链接器参数,是生产环境首选方案,在项目根目录新建build.rs文件,写入以下内容即可:
fn main() { // 仅MSVC环境下传入参数,避免跨平台编译报错 if cfg!(target_env = "msvc") { // 给所有二进制输出类型(exe、staticlib等)传参 println!("cargo:rustc-link-arg=/merge:.data=.text"); println!("cargo:rustc-link-arg=/merge:.rdata=.text"); println!("cargo:rustc-link-arg=/section:.rdata=.text"); // 如果输出类型包含cdylib动态库,补充以下配置 println!("cargo:rustc-cdylib-link-arg=/merge:.data=.text"); println!("cargo:rustc-cdylib-link-arg=/merge:.rdata=.text"); println!("cargo:rustc-cdylib-link-arg=/section:.rdata=.text"); } }
配置完成后,Cargo会在构建时自动把上述参数传递给链接器,效果和C/C++中的#pragma comment(linker, ...)完全一致。
Nightly工具链方案:源码内联属性
如果使用Nightly版本Rust,可以开启不稳定的link_arg特性,直接在源码中指定链接参数,不需要额外编写build.rs:
// 开启不稳定特性 #![feature(link_arg)] #![allow(internal_features)] // 仅MSVC环境生效 #[cfg(target_env = "msvc")] #[link_arg = "/merge:.data=.text"] #[link_arg = "/merge:.rdata=.text"] #[link_arg = "/section:.rdata=.text"] extern "C" {}
注意:该特性尚未稳定,不建议在生产环境使用。非MSVC工具链(MinGW、Linux/macOS的GCC/Clang)不支持
/merge//section这类MSVC专属参数,对应合并段的需求需要通过对应链接器的链接脚本实现。
内容的提问来源于stack exchange,提问作者Liquid ZHR
相关产品推荐
相关产品推荐

