Rust Cargo CMake与C++库依赖项的集成

62lalag4  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(215)

假设我有一个Rust项目,它想要使用一个基于CMake的C++库,为此,我使用了一个类似下面的build.rs脚本,它使用cmakecxx包来构建一个外部项目(spikes):

let path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let external = path.join("external");
let spikes = external.join("spikes");
if spikes.exists()
{
    println!("cargo:rustc-cfg=spikes");
    let ccl_includes = spikes.join("src");
    let dst = cmake::Config::new(spikes).build();
    let lib = "spikes_common";
    println!("cargo:rustc-link-search=native={}/lib/spikes", dst.display());
    println!("cargo:rustc-link-lib=static={}", lib);

    // Attempt to build the C++-bridge.
    cxx_build::bridge("src/imageio_cxx.rs")
        .file("external/imageio-bridge.cpp")
        .include(spikes_includes)
        .flag_if_supported("-std=c++17")
        .compile("libimageio-bridge");
    println!("cargo:rerun-if-changed=external/imageio-bridge.h");
    println!("cargo:rerun-if-changed=external/imageio-bridge.cpp");
}

这在大多数情况下工作正常,但我似乎找不到任何关于如何处理C项目中的链接依赖关系的文档。例如,在上面的示例中,C库使用OpenEXR,但自然地,链接器标志不会传播到Rust项目。使其在编译链接步骤中失败。当前将链接器标志从C++项目传播到Cargo的最佳实践是什么?

zpf6vheq

zpf6vheq1#

所以根据我读到的关于这个箱子的资料我可以预见三种选择:

  • 您可以从cmake文件中提取适当的标志,构造一个字符串片并将其传递给桥
  • 你手动输入它们
  • 或者这个黑客式的解决方案:通过pkg-config(如果适用)pkg-config只粘贴您指定要粘贴的内容。

如果您选择选项3,则有两个选项可供选择

  1. I don't see under the hood of cxx.rs, but perhaps you could pass it to the flags_if_possible - I've done similar hacks before in qmake.
    1.您只需执行命令,获取输出并创建一个字符串切片,然后将其输入到同一个方法中。
    希望能有所帮助!
    编辑:如果存在cmake文件,则IIRC cmake具有从其目标生成pkg-config文件的特性。

相关问题