编译Rust静态库并在C ++中使用它:未定义的引用

时间:2018-05-08 08:20:11

标签: c++ linker rust static-libraries

我试图在Rust中编译static库,然后在我的C ++代码中使用它(注意这是关于从C ++调用Rust而不是相反)。我查阅了我在网上找到的所有教程,并回答了类似的问题,我显然做错了什么,虽然我看不清楚。

我为我的问题创建了一个最小的例子:

1。 Cargo.toml:

[package]
name = "hello_world"
version = "0.1.0"

[lib]
name = "hello_in_rust_lib"
path = "src/lib.rs"
crate-type = ["staticlib"]

[dependencies]

2。 lib.rs:

#[no_mangle]
pub unsafe extern "C" fn hello_world_in_rust() {
    println!("Hello World, Rust here!");
}

第3。 hello_world_in_cpp.cpp:

extern void hello_world_in_rust();

int main() {
    hello_world_in_rust();
}

要构建库,在我的Rust目录中运行:

  

货物构建--lib

(很好) 我继续在我的C ++文件夹中运行:

  

clang ++ hello_world_in_cpp.cpp -o hello.out -L ../hello_world/target/release/ -lhello_in_rust_lib

导致以下错误:

  

/tmp/hello_world_in_cpp-cf3577.o:在函数main中:

     

hello_world_in_cpp.cpp :(。text + 0x5):对hello_world_in_rust()的未定义引用

1 个答案:

答案 0 :(得分:1)

中的名称修改未标准化,因此与相比,void hello_world_in_rust()可能具有不同的链接。您可以使用extern "C"作为函数签名/原型的一部分,在两种语言中强制使用相同的C链接:

extern "C" void hello_world_in_rust();