在32位Windows上静态链接错误地添加了一个前导下划线

时间:2016-09-15 14:42:39

标签: windows linker rust

我正在尝试构建一个可以使用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中正确导入和调用这些函数?

1 个答案:

答案 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>