gpt4 book ai didi

c - 如何在 Rust 中使用编译的 C .so 文件

转载 作者:行者123 更新时间:2023-12-03 11:31:08 47 4
gpt4 key购买 nike

has updated because of some suggestions



系统:macOS 10.14.6

我想在这里问的问题是如何使用 rust 调用已编译的 .so 文件,抱歉,我是这部分的新手。

我有一个非常简单的c文件:
#include "add.h"

int add(int a, int b) {
return a + b;
}

然后我用了 gcc-fPIC -shared -o libadd.so add.c编译成.so文件,放到lib目录下

然后我在 rust 的 build.rs 文件中写了这个:

use std::env;
use std::path::{Path};

fn main() {
let pwd_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let path = Path::new(&*pwd_dir).join("lib");
println!("cargo:rustc-link-search=native={}", path.to_str().unwrap());
println!("cargo:rustc-link-lib=dylib=add");
// println!("cargo:rustc-link-lib=static=add");
// println!("cargo:rerun-if-changed=src/hello.c");
}

我希望我可以得到并使用这个函数,main.rs 是:
extern { fn add(a: i32, b: i32) -> i32; }

fn main() {
let c = unsafe { let d = add(3, 5); d };
println!("c: {:?}", c);
}
cargo build没问题,但是 cargo run有错误:
   Compiling hello-from-generated-code-3 v0.1.0 (/Users/niexiaotao/work/rust-server/rust-ffi/hello-from-generated-code-3)
Finished dev [unoptimized + debuginfo] target(s) in 0.34s
Running `target/debug/hello-from-generated-code-3`
dyld: Library not loaded: libadd.so
Referenced from: /Users/niexiaotao/work/rust-server/rust-ffi/hello-from-generated-code-3/target/debug/hello-from-generated-code-3
Reason: image not found
[1] 81811 abort cargo run

另一件事:我将 .so 更改为 .a 并且 cargo 运行没问题。

示例代码 here

感谢您的帮助!

最佳答案

我遇到了同样的问题。 Cargo 似乎可以正确构建您的库,因为您明确告诉它在哪里查找文件(使用 rustc-link-search )。然而,当你去运行它时,Linux 并不知道它在哪里。

如果您要运行 ldd在你编译的 Rust 二进制文件上,你会得到这样的信息:

$ ldd target/debug/hello-from-generated-code-3
linux-vdso.so.1 (0xabcd)
libadd.so => not found <----- ldd can't find your library
...

这是因为在 LD_LIBRARY_PATH 中找不到您的 .so 文件.您可以通过将库复制到相关文件夹或在运行程序时设置它来解决此问题。例如,你应该能够说:
LD_LIBRARY_PATH=. cargo run

(或您的 .so 文件所在的任何其他路径 - 不一定是 . )

关于c - 如何在 Rust 中使用编译的 C .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60236701/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com