所以我将Rust FFI编写到一个C ++库中,该库有一个extern" C"阻止其中包含C风格的函数头。而我的低级FFI构建。
但是,当我在另一个项目中使用我的FFI时,它没有正确链接,我得到了对运算符new(),delete()等的未定义引用。
我的问题是:
我搞砸了,因为这是C ++而你无法将Rust链接到C ++吗?
使用FFI库的应用程序是否应该以某种方式处理链接问题?若然,怎么做?
我的libsomething.a可以以某种方式构建,以包含这些C ++组件,如果是这样,如何?我目前正在使用gcc crate。
将您自己的解决方案放在此处
答案 0 :(得分:6)
您需要动态链接到libstdc++
以获取C ++代码所需的符号。您可以在构建脚本中指示rustc
执行此操作:
extern crate gcc;
use std::default::Default;
fn main() {
gcc::compile_library("libhello.a", &Default::default(), &["cpp/hello.cpp"]);
println!("cargo:rustc-flags=-l dylib=stdc++");
}
有关构建脚本的详细信息,请参阅the Cargo guide。
答案 1 :(得分:1)
这对于我使用cmake板条箱在macOS上有效。
// build.rs
extern crate cmake;
fn main() {
let dst = cmake::Config::new("my_c_lib")
.no_build_target(true)
.always_configure(true)
.build();
// This was the fix
println!("cargo:rustc-flags=-l dylib=c++");
// The cmake crate outputs the static lib in the build subdir in the cargo $OUT_DIR,
// which is a little different than their docs show.
println!("cargo:rustc-link-search=native={}/build", dst.display());
println!("cargo:rustc-link-lib=static=my_c_lib");
}
请注意,我在native/
下拥有C / C ++代码作为git子模块,并且该项目正在使用cmake。
This answer也有帮助。