编译Rust静态库并在C+中使用+;:符号未找到 我试图在锈中编译静态库,然后在C++代码中使用它(注意这是关于C++调用Rust而不是相反)。我浏览了所有我能在网上找到的教程,并回答了类似的问题,我显然做错了什么,尽管我看不出是什么

编译Rust静态库并在C+中使用+;:符号未找到 我试图在锈中编译静态库,然后在C++代码中使用它(注意这是关于C++调用Rust而不是相反)。我浏览了所有我能在网上找到的教程,并回答了类似的问题,我显然做错了什么,尽管我看不出是什么,c++,linker,rust,static-libraries,c,C++,Linker,Rust,Static Libraries,C,我为我的问题创建了一个简单的示例: 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] #[no_mangle] pub unsa

我为我的问题创建了一个简单的示例:

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]
#[no_mangle]
pub unsafe extern "C" fn hello_world_in_rust() {
    println!("Hello World, Rust here!");
}
extern void hello_world_in_rust();

int main() {
    hello_world_in_rust();
}
2。图书馆馆长:

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

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

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

int main() {
    hello_world_in_rust();
}
3。您好\u world\u in\u cpp.cpp:

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

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

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

int main() {
    hello_world_in_rust();
}
为了构建库,我在我的rust目录中运行了:

货物建造——lib

(一切顺利) 我继续运行,在我的C++文件夹中:

clang++hello\u world\u in\u cpp.cpp-o hello.out-L../hello\u world/target/release/-lhello\u in\u rust\u lib

这导致了以下错误:

/tmp/hello\u world\u in_cpp-cf3577.o:在函数
main
中:

hello\u world\u in_cpp.cpp:(.text+0x5):未定义对\u rust()中的
hello\u world\u的引用。

名称损坏不是标准化的,因此,
void hello\u world\u in\u rust()
的链接可能与其他链接不同。通过使用
extern“C”
作为函数签名/原型的一部分,可以在两种语言中强制使用相同的C链接:

extern "C" void hello_world_in_rust();

“这和我们的问题是一样的吗?”kazemakase不幸的是,就我所见,不是。这是C++,我试着切换到G++(而不是CLAN++),但它没有效果。希尔直观地猜到C++或C没关系…等等,你不需要在C++中指定<代码>外“C”<代码>吗?@ VTT我尝试了动态库(即,通过将“CRATE type = [ DyLIB ] ]添加到我的货物文件中创建一个.so文件。它导致了编译中完全相同的“未定义的引用”错误。