[英]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: >k::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
命名空間。 同樣的簡單命名約定適用於示例代碼中出現的gio
和glib
命名空間要求。 它們似乎都來自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.