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

3
我正在尝试在Rust中编译一个静态库,然后在我的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 目录中运行:
``` cargo build --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: In function `main': hello_world_in_cpp.cpp:(.text+0x5): undefined reference to `hello_world_in_rust()' ```

这是否与 https://dev59.com/xFcP5IYBdhLWcg3wxMs5 中提到的问题相同? - MB-F
很遗憾,就我所看到的情况而言,它并不是这样的。这是C++,我尝试切换到g++(而不是clang++),但没有效果。 - Shir
3
直觉上我猜测使用C++或者C都无所谓......等等,不是在C++中需要指定extern "C"吗? - MB-F
@VTT 我尝试了动态库(即通过在我的货物文件中添加“crate-type = [“dylib”]”来链接我创建的.so文件)。编译时结果出现了完全相同的“未定义引用”错误。 - Shir
@kazemakase 哇,太棒了!谢谢你。 - Shir
显示剩余5条评论
1个回答

4

中的名称修饰未经标准化,因此void hello_world_in_rust()相比可能具有不同的链接方式。您可以通过在函数签名/原型中使用extern "C"来强制在两种语言中使用相同的C链接。

extern "C" void hello_world_in_rust();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接