书中的FFI示例在Windows下找不到-lanneclib

use*_*062 5 windows rust

外部c dll与回调示例之后链接时出错.

我创建了anneclib.dll并将其分散(并且lib)甚至尝试了完整路径但仍然得到相同的错误(但是有完整路径).

错误1错误:链接gcc失败:退出代码:1注意:"gcc"" - WI, - enable-long-section-names"" - fno-use-linker-plugin"" - WI, - nxcompat"" -static-libgcc"" - m64"" - L""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib"" - o""obj\Debug\Anne.exe ""obj\Debug\Anne.o"" - WI, - gc-sections""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib\libstd-4e7c5e5c.rlib ""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib\libcollections-4e7c5e5c.rlib""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc -windows-gnu\lib\libunicode-4e7c5e5c.rlib""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib\librand-4e7c5e5c.rlib""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib\liballoc-4e7c5e5c.rlib""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib\liblibc-4e7c5e5c.rlib""C:\ Program Files\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib\libcore-4e7c5e5c.rlib"" - L""C:\ Program File s\Rust stable 1.0\bin\rustlib\x86_64-pc-windows-gnu\lib"" - L""C:\ src\ann\anne.rust\anne.rust\Anne.rust\bin\x86_64-pc- windows-gnu"" - L""C:\ src\ann\anne.rust\anne.rust\Anne\bin\x86_64-pc-windows-gnu"" - WI, - whole-archive"" - Wl, -Bstatic""-Wl, - no-whole-archive""-Wl,-Bdynamic"" - lanneclib"" - lws2_32"" - luserenv"" - lcompiler-rt"注意:ld:找不到-lanneclib

使用Visual Studio Rust项目.

我应该把它放在哪里?

extern fn callback(a: i32) {
    println!("I'm called from C with value {0}", a);
}

#[link(name = "anneclib")]
extern {
   fn register_callback(cb: extern fn(i32)) -> i32;
   fn trigger_callback();
}

fn main() {
    unsafe {
        register_callback(callback);
        trigger_callback(); // Triggers the callback
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 3

在错误消息中您可以看到该文件夹[your source folder]\bin\x86_64-pc-windows-gnu​​已添加到库路径中。您必须将您的库放入此文件夹中。您可能还需要在库名称中添加“lib”前缀。

这是一个对我有用的小例子:

带有 hello 函数的 AC 文件:

#include <stdio.h>

void hello() {
    printf("Hello from C!\n");
}
Run Code Online (Sandbox Code Playgroud)

使用 MinGW 将 C 文件编译为共享库 libhello.c:

gcc -shared -o libhello.dll hello.c
Run Code Online (Sandbox Code Playgroud)

Rust 文件 main.rs:

#[link(name = "hello")]
extern {
    fn hello();
}

fn main() {
    unsafe { hello(); }
}
Run Code Online (Sandbox Code Playgroud)

现在您必须将 libhello.dll(的副本)放入子文件夹 \bin\x86_64-pc-windows-gnu 中:

+ bin
+ --- x86_64-pc-windows-gnu
      + --- libhello.dll
+ main.rs
Run Code Online (Sandbox Code Playgroud)

你应该能够通过编译它

rustc main.rs
Run Code Online (Sandbox Code Playgroud)

请注意,为了执行 main.exe,您还需要 main.exe 旁边或系统路径中的 libhello.dll 副本。