如何优雅地“包含”;gtk层壳.h“;锈迹斑斑 我试图在我的RID代码中有一些C++代码,我有以下的语句: #include "gtk-layer-shell.h"

如何优雅地“包含”;gtk层壳.h“;锈迹斑斑 我试图在我的RID代码中有一些C++代码,我有以下的语句: #include "gtk-layer-shell.h",c++,rust,include-path,C++,Rust,Include Path,我在build.rs中指定了文件的位置,但是由于所有的依赖关系,它有点混乱。我的build.rs如下所示: extern crate cpp_build; fn main() { let include_layer_shell = "/usr/include/gtk-layer-shell"; let include_gtk = "/usr/include/gtk-3.0"; let include_glib = "/u

我在build.rs中指定了文件的位置,但是由于所有的依赖关系,它有点混乱。我的build.rs如下所示:

extern crate cpp_build;

fn main() {
    let include_layer_shell = "/usr/include/gtk-layer-shell";
    let include_gtk = "/usr/include/gtk-3.0";
    let include_glib = "/usr/include/glib-2.0";
    let include_glib_config = "/usr/lib/glib-2.0/include";
    let include_pango = "/usr/include/pango-1.0";
    let include_harfbuzz = "/usr/include/harfbuzz";
    let include_cairo = "/usr/include/cairo";
    let include_gdk_pixbuf = "/usr/include/gdk-pixbuf-2.0";
    let include_atk = "/usr/include/atk-1.0";
    cpp_build::Config::new()
        .include(include_layer_shell)
        .include(include_gtk)
        .include(include_glib)
        .include(include_glib_config)
        .include(include_pango)
        .include(include_harfbuzz)
        .include(include_cairo)
        .include(include_gdk_pixbuf)
        .include(include_atk)
        .build("src/main.rs");
}
是否有一种方法可以更优雅地包含它,只指定gtk layer shell.h的位置,并自动找到所有其他的位置?我还希望能够交叉编译aarch64的应用程序。按照我现在的设置方式,我想我必须根据拱门改变路径,拱门看起来也有点凌乱

谢谢你的帮助!:)

附言:
我需要C++代码的原因主要是因为我不知道我将如何编写<代码> gtkj-Layer-GuiTyfFiOffelyWindows(GTKYWindows);代码>锈,所以如果有人知道如何完全避免C++代码,那将更好。p> 感谢您的建议,我现在使用gir生成绑定和安全的防锈包装。这要简单得多,但只适用于与GTK相关的事情,并且需要一个.gir文件。可以在此处找到教程:

在此之前,我使用bindgen和pkg_配置板条箱,并将我的build.rs更改为以下内容:

extern crate bindgen;
extern crate pkg_config;

use std::env;
use std::path::PathBuf;

fn main() {
    let library = pkg_config::Config::new()
        .probe("gtk-layer-shell-0")
        .expect("No gtk-layer-shell found on your system");
    let include_paths = library
        .include_paths
        .into_iter()
        .map(|p| p.into_os_string().into_string().unwrap())
        .collect::<Vec<_>>();

    for path in library.link_paths {
        println!("cargo:rustc-link-path={}", path.to_str().unwrap());
    }
    for lib in library.libs {
        println!("cargo:rustc-link-lib={}", lib);
    }

    // Tell cargo to invalidate the built crate whenever the wrapper changes
    println!("cargo:rerun-if-changed=wrapper.h");

    // The bindgen::Builder is the main entry point
    // to bindgen, and lets you build up options for
    // the resulting bindings.
    let mut bindings = bindgen::Builder::default()
        // The input header we would like to generate
        // bindings for.
        .header("wrapper.h")
        // Tell cargo to invalidate the built crate whenever any of the
        // included header files changed.
        .parse_callbacks(Box::new(bindgen::CargoCallbacks));

    for path in include_paths {
        bindings = bindings.clang_args(&["-F", &path]);
    }

    let bindings = bindings
        // Finish the builder and generate the bindings.
        .generate()
        // Unwrap the Result and panic on failure.
        .expect("Unable to generate bindings");

    // Write the bindings to the $OUT_DIR/bindings.rs file.
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}
外部板条箱bindgen;
外部板条箱包装配置;
使用std::env;
使用std::path::PathBuf;
fn main(){
让library=pkg_config::config::new()
.探头(“gtk-layer-shell-0”)
.expect(“在您的系统上找不到gtk层外壳”);
让我们包含_路径=库
.包含路径
.into_iter()
.map(| p | p.到_os_string().到_string().展开())
收集::();
对于library.link\u路径中的路径{
println!(“cargo:rustc link path={},path.to_str().unwrap());
}
对于library.libs中的lib{
println!(“货物:rustc-link-lib={}”,lib);
}
//当包装物发生变化时,告诉货物使已制造的板条箱失效
println!(“货物:更改后重新运行=wrapper.h”);
//bindgen::Builder是主要的入口点
//到bindgen,并允许您为
//结果绑定。
让mut bindings=bindgen::Builder::default()
//我们要生成的输入头
//绑定。
.header(“wrapper.h”)
//无论何时发生以下情况,都应通知货物公司使已建造的板条箱失效:
//包含的头文件已更改。
.parse_回调(Box::new(bindgen::CargoCallbacks));
对于include_路径中的路径{
bindings=bindings.clang_参数(&[“-F”,&path]);
}
设bindings=bindings
//完成构建器并生成绑定。
.generate()
//打开结果并在失败时惊慌失措。
.expect(“无法生成绑定”);
//将绑定写入$OUT\u DIR/bindings.rs文件。
释放路径=PathBuf::from(env::var(“out\u DIR”).unwrap();
绑定
.write_to_文件(out_path.join(“bindings.rs”))
.expect(“无法写入绑定!”);
}

<代码>你确定它是C++,不是C?如果是C,或者C++库导出C abi,那么您就可以轻松地执行FFI而不需要混合语言。<代码> GTKYLYERY-IITHOFIOLKORKONE/CODEN>来自C库,所以除非有人已经编写了绑定,否则您可能无法避免在您的身边绑定。code>bindgen
可能会有所帮助。您考虑过使用板条箱吗?板条箱有包装器和绑定用于大多数GTK功能。