簡體   English   中英

如何從 Rust 鏈接 gtk?

[英]How to link gtk from Rust?

我正在使用來自https://www.gtk.org的 GTK 提供的 Rust 示例,我想知道如何將 GTK 確定為依賴項(或其他類型的先決條件),以便那里給出的 Rust 程序將使用貨物構建。

這是從那里復制的代碼,未經修改:

use gio::prelude::*;
use glib::clone;
use gtk::prelude::*;

// When the application is launched…
fn on_activate(application: &gtk::Application) {
    // … create a new window …
    let window = gtk::ApplicationWindow::new(application);
    // … with a button in it …
    let button = gtk::Button::new_with_label("Hello World!");
    // … which closes the window when clicked
    button.connect_clicked(clone!(@weak window => move |_| window.close()));
    window.add(&button);
    window.show_all();
}

fn main() {
    // Create a new application
    let app = gtk::Application::new(Some("com.github.gtk-rs.examples.basic"), Default::default())
        .expect("Initialization failed...");
    app.connect_activate(|app| on_activate(app));
    // Run the application
    app.run(&std::env::args().collect::<Vec<_>>());
}

Cargo.toml ,如果沒有任何Cargo.toml為 gtk 定義,編譯程序時 gtk 符號將無法解析。

你會怎么做最慣用的?

當然,我的系統上確實安裝了 GTK。

謝謝!

Rust 可以使用 C ABI 調用代碼,但正如@Herohtar 解釋的那樣,它不是自動的。 您需要向編譯器提供有關extern "C"函數的信息才能調用它們。

對於普通庫,可能存在現有綁定。 這些是 Rust 庫 crate,其中包含已經為您編寫的所有膠水。 它們的工作方式與您放入Cargo.toml文件中的任何其他 Rust 依賴項一樣。

所以確實我最終遵循了使用gtk-rs rust 集成項目的建議方法,而不是追求我自己的任何 gtk 包裝器。 我最初的困惑是gtk 網站只提供了 gtk-rs 示例代碼,而沒有任何參考或提及假設的 gtk-rs 項目。

即使在原始代碼示例頁面中沒有明確說明,該代碼假定的 public crate 稱為 gtk; 我想這是默認的命名約定:命名空間和 crate 名稱通常相同。

在構建中包含該 crate 確實滿足了代碼中出現的gtk命名空間。 同樣的簡單命名約定適用於示例代碼中出現的gioglib命名空間要求。 它們似乎都來自gtk-rs 項目,盡管與其他編程語言不同,這在 crate 規范中沒有明確說明,因為只有創建的名稱,而不是包含它的項目,在貨物中指定。

至於版本,我選擇了 gtk crate 的最新版本(根據我的 VSCode rust 插件的建議)和最新的 crate 功能,提供對 GTK 最新支持的 API 的支持。

我還隨意從另一個 gtk-rs 項目中提取了 gio 和 glib crate 的版本,希望在最后兩個和 gtk crate 本身之間實現無縫的互操作性,因為它們似乎需要單獨指定,而不是由 gtk crate 引入本身。

因此,使用 Cargo.toml 中的以下依賴項定義,示例代碼可以工作:

[dependencies]
gtk = { version = "0.9.2", features = ["v3_22"] }
glib = "0.10"
gio = { version = "0.9", features = ["v2_56"] }

我是 rust 的新手,但目前我可能認為其中一些比其他 rust 項目可能或將要復雜,或者,使用示例代碼假設熟悉 gtk 的兼容性方案- rs crates 或 gtk 與 glib 和 gio 版本的底層原生兼容性!

后一方面可能足夠簡單,但沒有在 gtk-rs 文檔討論版本控制的地方明確討論。

對我來說,一個奇怪的症結是我必須用下面的方法替換下面的方法,也許這個代碼示例與最新版本的 crate 相比有點過時了(?!)。

提供的代碼示例:

gtk::Button::new_with_label

定義的實際方法:

gtk::Button::with_label

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM