在Rust中为MSVC工具链链接C++标准库头文件的方法
解决Windows MSVC工具链下链接C++标准库的问题
MSVC工具链下的C标准库和GNU工具链的stdc++完全不同,你之前尝试的math库也不对——因为你的代码用到了std::vector、std::thread这类C标准库专属组件,必须链接MSVC专属的C++标准库文件。
具体实现
在build.rs里根据目标工具链自动适配链接的库,这样跨平台构建都能正常工作:
use std::env; fn main() { let target = env::var("TARGET").unwrap(); match target.as_str() { t if t.contains("windows-msvc") => { // 动态链接MSVC的C++标准库(需要用户系统安装对应VC++运行时) println!("cargo:rustc-flags=-l dylib=msvcprt"); // 如果要静态链接(把库打包进二进制,无需额外依赖),替换成下面这行: // println!("cargo:rustc-flags=-l static=libcpmt"); } t if t.contains("linux") || t.contains("gnu") => { // GNU工具链下继续使用stdc++ println!("cargo:rustc-flags=-l dylib=stdc++"); } _ => {} } }
关键说明
- MSVC的C++标准库分动态(
msvcprt.lib)和静态(libcpmt.lib)两种,按需选择即可。 - 单独链接
math.lib无效的原因:MSVC的数学函数已经整合到C/C标准库中,而且你的代码依赖的不只是数学函数,还有C容器、线程、IO流这类完整的C标准库功能,必须链接专门的C标准库文件。
内容的提问来源于stack exchange,提问作者Brandon Piña
相关产品推荐
相关产品推荐

