链接到具有 extern "C" 函数的 C++ 库
Linking to a C++ library that has extern "C" functions
所以我正在将一个 Rust FFI 写入一个 C++ 库,该库有一个 extern "C" 块,其中包含 C 风格的函数头。我的低级 FFI 构建。
但是,当我在另一个项目中使用我的 FFI 时,它 link 不正确,我得到了对运算符 new()、delete() 等的未定义引用
我的问题是:
我是不是搞砸了,因为这是 C++ 而你还不能 link Rust 到 C++?
使用 FFI 库的应用程序是否应该以某种方式处理 linking 问题,如果是,如何处理?
能否以某种方式构建我的 libsomething.a 以包含这些 C++ 组件?如果可以,如何构建?我目前使用的是 gcc crate,相当一般。
将您自己的解决方案放在这里
您需要动态地 link 到 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。
这对我在 macOS 上使用 cmake crate 有效。
// 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");
}
请注意,我将 C/C++ 代码作为 native/
下的 git 子模块,并且该项目正在使用 cmake。
This answer 也有帮助。
所以我正在将一个 Rust FFI 写入一个 C++ 库,该库有一个 extern "C" 块,其中包含 C 风格的函数头。我的低级 FFI 构建。
但是,当我在另一个项目中使用我的 FFI 时,它 link 不正确,我得到了对运算符 new()、delete() 等的未定义引用
我的问题是:
我是不是搞砸了,因为这是 C++ 而你还不能 link Rust 到 C++?
使用 FFI 库的应用程序是否应该以某种方式处理 linking 问题,如果是,如何处理?
能否以某种方式构建我的 libsomething.a 以包含这些 C++ 组件?如果可以,如何构建?我目前使用的是 gcc crate,相当一般。
将您自己的解决方案放在这里
您需要动态地 link 到 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。
这对我在 macOS 上使用 cmake crate 有效。
// 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");
}
请注意,我将 C/C++ 代码作为 native/
下的 git 子模块,并且该项目正在使用 cmake。
This answer 也有帮助。