我正在尝试构建一个可以使用Opus编解码器的Rust库。编译x86_64-pc-windows-msvc
时,一切都会按预期进行。但是,当我为i686-pc-windows-msvc
编译时,出现关于 Unresolved external 组件的错误。例如
显然这失败了,因为它正在寻找错误的名称!那里不应该有下划线。我的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导入并调用这些函数?
最佳答案
导入依赖项的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
属性用于构建脚本所构建的平台,而不是实际代码本身所构建的平台(回想起来,这实际上是显而易见的)!关于windows - 在32位Windows上静态链接错误地添加了下划线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39514007/