链接到具有 extern "C" 函数的 C++ 库

Linking to a C++ library that has extern "C" functions

所以我正在将一个 Rust FFI 写入一个 C++ 库,该库有一个 extern "C" 块,其中包含 C 风格的函数头。我的低级 FFI 构建。

但是,当我在另一个项目中使用我的 FFI 时,它 link 不正确,我得到了对运算符 new()、delete() 等的未定义引用

我的问题是:

  1. 我是不是搞砸了,因为这是 C++ 而你还不能 link Rust 到 C++?

  2. 使用 FFI 库的应用程序是否应该以某种方式处理 linking 问题,如果是,如何处理?

  3. 能否以某种方式构建我的 libsomething.a 以包含这些 C++ 组件?如果可以,如何构建?我目前使用的是 gcc crate,相当一般。

  4. 将您自己的解决方案放在这里

您需要动态地 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++");
}

See full example on github

有关构建脚本的详细信息,请参阅 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 也有帮助。