假设我有一个Rust项目,它想要使用一个基于CMake
的C++库,为此,我使用了一个类似下面的build.rs
脚本,它使用cmake
和cxx
包来构建一个外部项目(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
的最佳实践是什么?
1条答案
按热度按时间zpf6vheq1#
所以根据我读到的关于这个箱子的资料我可以预见三种选择:
pkg-config
(如果适用)pkg-config只粘贴您指定要粘贴的内容。如果您选择选项3,则有两个选项可供选择
flags_if_possible
- I've done similar hacks before in qmake.1.您只需执行命令,获取输出并创建一个字符串切片,然后将其输入到同一个方法中。
希望能有所帮助!
编辑:如果存在cmake文件,则IIRC cmake具有从其目标生成pkg-config文件的特性。