我正在尝试构建一个可以使用Opus编解码器的Rust库。编译x86_64-pc-windows-msvc
时,一切都按预期工作。但是,当我为i686-pc-windows-msvc
编译时,我收到有关未解析的外部错误的错误。 e.g。
错误LNK2001:未解析的外部符号_opus_encoder_create
显然这是失败的,因为它正在寻找错误的名字!那里不应该是一个领先的下划线。我的Rust导入如下:
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中正确导入和调用这些函数?
答案 0 :(得分:0)
导入依赖项的Rust构建脚本需要一些逻辑来为不同的平台执行不同的工作。 e.g。
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
属性是针对构建脚本正在构建的平台,而不是实际代码本身构建的平台(回想起来,这实际上相当明显)!< / p>