如何在Rust可执行文件中导出DirectX Agility SDK所需符号
解决Rust中导出DX Agility SDK所需符号的问题
要让DirectX Agility SDK正确加载,你需要导出D3D12SDKVersion和D3D12SDKPath两个符号,并且确保Windows链接器将它们包含在可执行文件的导出表中。你当前的代码缺少两个关键部分:完整的符号定义,以及告诉链接器导出符号的配置。
1. 补全符号定义代码
首先,你需要同时定义官方要求的两个静态符号,D3D12SDKPath需要是一个以null结尾的空字符串:
#[used] #[no_mangle] #[export_name = "D3D12SDKVersion"] pub static D3D12_SDK_VERSION: u32 = 711; // 对应SDK版本1.711.3-preview #[used] #[no_mangle] #[export_name = "D3D12SDKPath"] pub static D3D12_SDK_PATH: &[u8] = b"\0"; // 空路径字符串,必须以null结尾
2. 配置链接器导出符号
Windows链接器默认不会导出可执行文件中的符号,必须显式指定要导出的符号。你可以通过两种方式配置:
方式一:修改Cargo.toml
在Cargo.toml中添加目标特定的rustflags,传递链接器参数:
[target.x86_64-pc-windows-msvc] rustflags = [ "-C", "link-args=/EXPORT:D3D12SDKVersion", "-C", "link-args=/EXPORT:D3D12SDKPath", ] # 如果需要支持32位,添加以下配置 [target.i686-pc-windows-msvc] rustflags = [ "-C", "link-args=/EXPORT:D3D12SDKVersion", "-C", "link-args=/EXPORT:D3D12SDKPath", ]
方式二:使用build.rs脚本
在项目根目录创建build.rs文件,通过构建脚本动态传递链接器参数:
fn main() { // 告诉链接器导出指定符号 println!("cargo:rustc-link-args=/EXPORT:D3D12SDKVersion"); println!("cargo:rustc-link-args=/EXPORT:D3D12SDKPath"); }
3. 验证导出结果
重新构建项目后,使用dumpbin工具检查可执行文件的导出表:
dumpbin /exports target/release/your_project.exe
你应该能在输出中看到D3D12SDKVersion和D3D12SDKPath两个符号。
内容的提问来源于stack exchange,提问作者Julien Russo
相关产品推荐
相关产品推荐

