我正在尝试构建一个可以使用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/

10-11 22:12
查看更多