MsvcEnvironment
MSVC 工具链的完整环境配置。
定义
rust
pub struct MsvcEnvironment {
/// Visual C++ 安装目录 (VCINSTALLDIR)
pub vc_install_dir: PathBuf,
/// VC 工具安装目录 (VCToolsInstallDir)
pub vc_tools_install_dir: PathBuf,
/// VC 工具版本 (VCToolsVersion)
pub vc_tools_version: String,
/// Windows SDK 目录 (WindowsSdkDir)
pub windows_sdk_dir: PathBuf,
/// Windows SDK 版本 (WindowsSDKVersion)
pub windows_sdk_version: String,
/// 编译器包含路径
pub include_paths: Vec<PathBuf>,
/// 链接器库路径
pub lib_paths: Vec<PathBuf>,
/// 二进制路径(cl.exe、link.exe 等)
pub bin_paths: Vec<PathBuf>,
/// 目标架构
pub arch: Architecture,
/// 主机架构
pub host_arch: Architecture,
}创建
rust
use msvc_kit::{download_msvc, download_sdk, setup_environment, DownloadOptions};
let options = DownloadOptions::default();
let msvc = download_msvc(&options).await?;
let sdk = download_sdk(&options).await?;
// 从安装信息创建环境
let env = setup_environment(&msvc, Some(&sdk))?;工具路径方法
rust
/// 检查 cl.exe 是否可用
pub fn has_cl_exe(&self) -> bool;
/// 获取 cl.exe(C/C++ 编译器)路径
pub fn cl_exe_path(&self) -> Option<PathBuf>;
/// 获取 link.exe(链接器)路径
pub fn link_exe_path(&self) -> Option<PathBuf>;
/// 获取 lib.exe(静态库管理器)路径
pub fn lib_exe_path(&self) -> Option<PathBuf>;
/// 获取 ml64.exe(MASM 汇编器)路径
pub fn ml64_exe_path(&self) -> Option<PathBuf>;
/// 获取 nmake.exe(make 工具)路径
pub fn nmake_exe_path(&self) -> Option<PathBuf>;
/// 获取 rc.exe(资源编译器)路径
pub fn rc_exe_path(&self) -> Option<PathBuf>;
/// 获取所有工具路径
pub fn tool_paths(&self) -> ToolPaths;环境字符串方法
rust
/// 获取 INCLUDE 环境变量值
pub fn include_path_string(&self) -> String;
/// 获取 LIB 环境变量值
pub fn lib_path_string(&self) -> String;
/// 获取 PATH 附加值
pub fn bin_path_string(&self) -> String;导出方法
rust
/// 导出环境为 JSON
pub fn to_json(&self) -> serde_json::Value;使用示例
访问工具路径
rust
let env = setup_environment(&msvc, Some(&sdk))?;
if let Some(cl) = env.cl_exe_path() {
println!("cl.exe: {:?}", cl);
// 运行 cl.exe
std::process::Command::new(&cl)
.arg("/help")
.status()?;
}获取所有工具
rust
let tools = env.tool_paths();
println!("编译器: {:?}", tools.cl);
println!("链接器: {:?}", tools.link);
println!("库管理器: {:?}", tools.lib);
println!("汇编器: {:?}", tools.ml64);
println!("Make: {:?}", tools.nmake);
println!("资源编译器: {:?}", tools.rc);设置环境变量
rust
use std::env;
let msvc_env = setup_environment(&msvc, Some(&sdk))?;
// 设置 INCLUDE
env::set_var("INCLUDE", msvc_env.include_path_string());
// 设置 LIB
env::set_var("LIB", msvc_env.lib_path_string());
// 添加到 PATH
let current_path = env::var("PATH").unwrap_or_default();
env::set_var("PATH", format!("{};{}", msvc_env.bin_path_string(), current_path));导出为 JSON
rust
let env = setup_environment(&msvc, Some(&sdk))?;
let json = env.to_json();
// 保存到文件供外部工具使用
std::fs::write("msvc-env.json", serde_json::to_string_pretty(&json)?)?;输出:
json
{
"vc_install_dir": "C:\\msvc-kit\\VC",
"vc_tools_install_dir": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823",
"vc_tools_version": "14.44.34823",
"windows_sdk_dir": "C:\\msvc-kit\\Windows Kits\\10",
"windows_sdk_version": "10.0.26100.0",
"include_paths": [...],
"lib_paths": [...],
"bin_paths": [...],
"arch": "x64",
"host_arch": "x64",
"tools": {
"cl": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823\\bin\\Hostx64\\x64\\cl.exe",
"link": "...",
"lib": "...",
"ml64": "...",
"nmake": "...",
"rc": "..."
}
}生成 Shell 脚本
rust
use msvc_kit::env::{generate_activation_script, ShellType};
let script = generate_activation_script(&env, ShellType::PowerShell);
println!("{}", script);