c++ - 在 C++ 中使用 rust 库时未定义的引用
问题描述
我正在尝试在 C 中使用 Rust 代码。我用于no mangle
Rust 和extern "C"
将在 Rust 中定义的 C++ 代码。但是,当我试图将我的 Rust 库链接到我的 C++ 代码时,我不断收到未定义的引用
接口.rs
use std::os::raw::{c_int};
type OnDataCallback = unsafe extern "C" fn(data: *mut u8, len: usize) -> c_int;
static mut onDataCallback_: Option<OnDataCallback> = None;
#[no_mangle]
pub extern "C" fn registerOnDataCallback(cb: Option<OnDataCallback>) -> c_int
{
unsafe{onDataCallback_ = cb;}
return 0;
}
#[no_mangle]
pub extern "C" fn doSomething()
{
let mut s = String::from("hello world\0");
unsafe {
unsafe{onDataCallback_.unwrap()(s.as_mut_ptr() , 100)};
}
}
接口.cpp
#include <iostream>
typedef int (*onDataCallback_)(uint8_t *data, size_t len);
extern "C" int registerOnDataCallback(onDataCallback_ cb);
extern "C" void doSomething();
extern "C" int onDataCallback(uint8_t *data, size_t len) {
std::cout << "called onData with size " + len << std::endl;
}
int main() {
registerOnDataCallback(&onDataCallback);
doSomething();
getchar();
return 0;
}
我是如何编译的:
rustc --crate-type=staticlib interface.rs
g++ -o rust_c -L. -linterface interface.cpp
错误:
/tmp/ccgjsC7i.o: In function `main':
interface.cpp:(.text+0x51): undefined reference to `registerOnDataCallback'
interface.cpp:(.text+0x56): undefined reference to `doSomething'
collect2: error: ld returned 1 exit status
我遵循了 2 个不同的教程。我也试过 Cargo:
[package]
name = "smoltcp_c_interface"
version = "0.1.0"
[lib]
name = "smoltcp_c_interface"
path = "interface.rs"
crate-type = ["staticlib"]
[dependencies]
libc = "0.2.0"
然后做了cargo build
并尝试以与g++
上述相同的方式链接。相同的未定义引用。
解决方案
链接器从左到右搜索符号。在需要它们的源文件之后指定带有符号的库。
g++ -o rust_c -L. interface.cpp -linterface
然后添加 rust 依赖项 --pthread
和 dlsym -ldl
。
推荐阅读
- sapui5 - sapui5 vizframe 图到 pdf 问题
- gstreamer - GStreamer:VBI数据流解码
- java - 从未发送过 Google Play 游戏服务消息
- javascript - 如何在纯 javascript 或 vanilla js 中绑定双向数据?
- android - 如何更改远程视图中视图的属性?
- r - R:直接从 web url 读取 geotiff 数据(httr::GET 原始内容)
- javascript - XMasonry, XBlock (react-xmasonry) 用作单独的组件:TypeError: this.props.parent is undefined
- vba - VBA,根据指定工作表中的标识符列合并工作表中的表
- getstream-io - GetStream - 订购的聚合馈送时间
- python - 烧瓶部署:没有模块名称烧瓶