簡體   English   中英

在 C++ 中使用 rust 庫時未定義的引用

[英]Undefined reference when using rust library in C++

我正在嘗試在 C 中使用 Rust 代碼。 我對 Rust no mangle ,對將在 Rust 中定義的 C++ 代碼使用extern "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++鏈接。 相同的未定義引用。

Linker 從左到右搜索符號。 在需要它們的源文件之后指定帶有符號的庫。

g++ -o rust_c -L. interface.cpp -linterface

然后添加 rust 依賴項 - -pthread和 dlsym -ldl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM