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

标签 windows rust

external c dll with call back example 之后链接时出错.

我已经创建了 anneclib.dll 并将其分散(和 lib)甚至尝试了完整路径但仍然出现相同的错误(但有完整路径)。

Error 1 error: linking with gcc failed: exit code: 1 note: "gcc" "-Wl,--enable-long-section-names" "-fno-use-linker-plugin" "-Wl,--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" "-Wl,--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 Files\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" "-Wl,--whole-archive" "-Wl,-Bstatic" "-Wl,--no-whole-archive" "-Wl,-Bdynamic" "-lanneclib" "-lws2_32" "-luserenv" "-lcompiler-rt" note: ld: cannot find -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
    }
}

最佳答案

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

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

一个带有 hello 函数的 C 文件:

#include <stdio.h>

void hello() {
    printf("Hello from C!\n");
}

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

gcc -shared -o libhello.dll hello.c

Rust 文件 main.rs:

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

fn main() {
    unsafe { hello(); }
}

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

+ bin
+ --- x86_64-pc-windows-gnu
      + --- libhello.dll
+ main.rs

你应该可以通过

rustc main.rs

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

关于windows - 书中的 FFI 示例在 Windows 下找不到 -lanneclib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30545958/

相关文章:

rust - 为什么 Iterator::take_while 取得迭代器的所有权?

rust - 当我有一个大的 HashMap 字面量时,我该如何改进编译时间?

windows - Win32 : Get message notification of other application's close/exit

c++ - 如何遍历字符串数组并为不同的字符串应用函数?

windows - 从 cmd 提示符获取用户环境变量

rust - 如何在具有可变字段的结构上实现 move 语义?

rust - 有没有办法选择两个生命周期中较小的一个?

rust - 如何将多个 Rust 文件编译成一个 C 库?

c++ - 如何设置 Vim 以使用 Visual Studio 2010 的 C++ 编译器进行编译?

windows - Qt 静态链接和部署