在32位Windows上静态链接错误地添加一个领先的下划线

我正在尝试构build一个可以使用Opus编解码器的Rust库。 当为x86_64-pc-windows-msvc编译时,一切正常。 但是,当我编译为i686-pc-windows-msvc我得到关于未解决的外部错误。 例如

错误LNK2001:无法parsing的外部符号_opus_encoder_create

显然这是失败的,因为它正在寻找错误的名字! 那里不应该有一个领先的下划线。 我的铁锈导入如下所示:

 extern "C" { pub fn opus_encoder_create(fs:i32, chan:i32, app:i32, err:*mut i32) -> *mut OpusEncoder; } 

看起来Rust在开始时会自动插入下划线。 在32位和64位的lib文件(内置Visual Studio)上运行dumpbin可以让我:

32位:

 > 7202A opus_encoder_create 

64位:

 > 7202A opus_encoder_create 

没有下划线!

我究竟做错了什么? 我如何正确导入并从Rust调用这些函数?

导入依赖关系的Rust构建脚本需要一些逻辑来针对不同的平台进行不同的工作。 例如

 extern crate target_build_utils; use target_build_utils::TargetInfo; fn main() { let arch = TargetInfo::new().expect("could not get target info").target_arch(); match platform { "x86" => { /* import 32 bit dependencies */ "x86_64" => { /* import 64 bit dependencies */ } } 

我原来的脚本采取了以下的方法(谨慎,这是行不通的 ):

 fn main() { add_deps(); } #[cfg(target_arch = "x86")] fn add_deps() { /* import 32 bit dependencies */ } #[cfg(target_arch = "x86_64")] fn add_deps() { /* import 64 bit dependencies */ } 

然而,这些cfg属性是为构建脚本构建的平台,而不是实际代码本身构建的平台(回想起来,这实际上相当明显)!