【发布时间】:2020-02-15 07:18:14
【问题描述】:
由于一些建议而更新
系统: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 并且货物运行正常。
示例代码here
感谢您的帮助!
【问题讨论】:
-
我不知道 rust,但至少你应该使用 c,而不是 c++,因为 (1) 在 c++ 中的符号被破坏,并且 (2) 代码可能需要 c++ 运行时。也就是说,你把它放到文件 *.c 中并使用命令“gcc”而不是“g++”进行编译
-
谢谢你,我更新了描述
-
Using extern "C" in C++ code 也应该防止名称混淆。在这方面,应该不需要使用 C 编译器而不是 C++。
-
您的 Cargo.toml 中有
links = "add"吗?我不确定这是否有必要。编译静态库时适合我。 -
静态库可以但是bylib(.so)不行,有无link="add"都一样
标签: c rust shared-libraries