A. GTK+ 基礎,第 2 部分: 如何使用 GTK+
本文假設讀者熟悉基本的面向對象概念,比如類、對象、方法和繼承。雖然不需要能夠用 C 編寫程序,但是需要對 C 語言的語法有基本的理解。C 語言的 GTK+ 應用程序剖析我發現最好用示例來討論代碼。對於本文來說,我使用一個用 C 編寫的名為 Hello World 的簡短應用程序。雖然短小 —— 而且作為應用程序來說,基本沒什麼用 —— 但是這個應用程序的代碼確實展示了在進行 GTK+ 編程時可能會碰到的一些最有趣的概念(參見清單 1)。清單1. Hello World 應用程序的 GTK+ 代碼 #include <gtk/gtk.h> #include <libintl.h> #define _(x) gettext (x) #define N_(x) (x) #define GETTEXT_PACKAGE "gtk-hello" #define LOCALEDIR "mo" static char *greetings[] = { "Hello World", "Witaj ?wiecie", "世界に今日は" }; static char* choose_greeting () { return greetings[g_random_int_range (0, G_N_ELEMENTS (greetings))]; } static void cb_button_click(GtkButton *button, gpointer data) { GtkWidget *label = GTK_WIDGET(data); g_assert(label != NULL); gtk_label_set_text(GTK_LABEL (label), choose_greeting()); } static gboolean cb_delete(GtkWidget *window, gpointer data) { gtk_main_quit(); return FALSE; } int main (int argc, char *argv[]) { GtkWidget* window, *button, *label, *vbox; bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init(&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label (_("Hello World")); label = gtk_label_new (choose_greeting()); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER (window), vbox); gtk_container_add(GTK_CONTAINER (vbox), label); gtk_container_add(GTK_CONTAINER (vbox), button); g_signal_connect(G_OBJECT (window), "delete-event", G_CALLBACK(cb_delete), NULL); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_button_click), label); gtk_widget_show_all(window); gtk_main(); return 0; }概述在進入細節之前,先看看運行 Hello World 程序時發生的情況:初始化 GTK+ 和國際化(i18n)支持。創建部件(widget)。部件被組織成層次結構,讓 GTK+ 知道如何在屏幕上顯示它們。兩個信號處理器被連接起來 —— 一個用來在用戶關閉窗口時退出應用程序,另一個用來在用戶點擊按鈕時,修改顯示的歡迎信息。在屏幕上顯示窗口,應用程序調用 gtk_main(),激活主循環。主循環一直運行,直到用戶關閉窗口,調用 gtk_main_quit() 時才結束。初始化以下幾行初始化 GTK+ 和 i18n 支持:清單2. 初始化 GTK+ 和 i18n 支持 int main (int argc, char *argv[]) { GtkWidget* window, *button, *label, *vbox; bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init(&argc, &argv); C 程序員應當熟悉 main 聲明。(如果不是 C 程序員,那麼只需要知道這是應用程序開始執行的函數。)下一行包含幾個到 GtkWidget 類型的指針的聲明。GTK+ 是一個面向對象的工具包。所以,它使用常見的面向對象概念(例如繼承)來實現不同的部件。作為語言,C 缺乏對面向對象的內置支持。GTK+ 通過使用一些更聰明的技巧和 C 標准要求的一些有幫助的屬性,克服了這個缺點。在這個方案中,對象由指針代表,而 GtkWidget 是GTK+ 層次結構中的基本類型 —— 叫做 類,其他類都從它派生而來。所以,我把變數聲明為 GtkWidget*。下三行是在程序開始的地方應當包含的調用,用來得到國際化介面的支持。注意,在真實的應用程序中,不會手動聲明 LOCALEDIR 和GETTEXT_PACKAGE。編譯系統將會處理這些聲明。但是,在這個簡單示例中,聲明有助於澄清需要的內容。最後一行調用 gtk_init()。在進行其他 GTK+ 調用之前,必須調用這個函數,並把調用程序使用的參數傳遞給它。如果這個調用失敗,就會從沒有機會正確初始化自己的各個子系統得到多個錯誤消息。創建部件這四行分別調用不同的 _new() 函數:清單3. 調用不同的 _new() 函數 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label (_("Hello World")); label = gtk_label_new (choose_greeting()); vbox = gtk_vbox_new(FALSE, 0); 關於TOPLEVEL 的警告在看到 gtk_window_new 的TOPLEVEL 參數之後,可能想知道是否有其他可能的窗口類型。實際上,確實有。但是,對於 TOPLEVEL 之外的類型的需要很少見。而且,要使用不同的類型,必須對 GTK+ 與窗口系統的交互方式有很好的理解。所以,規則很簡單:一直 使用TOPLEVEL 參數。正如您所想,這些函數創建新的部件。所以,它們是代表部件的對象的構造函數。在 C++ 中,用特殊的方式標記構造函數,並用特殊語法進行調用。但是,因為 C 不支持面向對象,所以它們與普通的函數沒有什麼不同。只有添加到函數名尾部的 _new() 才表示這些函數實際上是構造函數。規定是:gtk_* 名稱空間中的每個構造函數都返回一個到 GtkWidget 的指針。這樣,通過聲明這種類型的變數,可以直接把構造函數調用的結果分配給對應的變數。如果查看單獨的構造函數,可以看到它們接受不同的參數,對應著它們創建的部件的類型。具體來說,gtk_window_new (GTK_WINDOW_TOPLEVEL) 創建新的 TOPLEVEL 窗口;也就是與用戶看成窗口的東西對應的部件,具有標題欄、關閉按鈕或者窗口系統添加的其他元素。對label 和button 的構造函數的調用做的工作正如您所料。但是,請注意傳遞給 button 的字元串周圍的下劃線和括弧(_())。這個宏調用 gettext() 常式,並且對於界面轉換至關重要。(關於 gettext 的更多信息,請參閱 參考資料。) 模樣古怪的 gtk_vbox_new(FALSE, 0) 創建垂直框(VBox)。雖然這個部件與屏幕上的任何可視像素都不對應,但是它在 GTK+ 的控制項布局中扮演著重要角色,您很快就會看到這一點。 決定布局這三行決定部件的布局: gtk_container_add(GTK_CONTAINER (window), vbox); gtk_container_add(GTK_CONTAINER (vbox), label); gtk_container_add(GTK_CONTAINER (vbox), button); 這些行是對類型 GtkContainer 的面向對象方法的調用。如果查看應用程序編程介面(API)參考,可以看到 GtkContainer 繼承自 GtkWidget,而且它的全部方法都接受 GtkContainer* 作為第一個參數。所以,GtkContainer* 是方法要在上面操作的對象實例。因為變數是 GtkWidget* 類型的,而且 C 編譯器不支持面向對象繼承,所以需要讓編譯器相信:向需要 GtkContainer* 的函數傳遞這些變數是安全的。GTK_CONTAINER() 宏通過實現到類型安全版 GtkContainer 的類型轉換做到了這一點。類型安全 意味著宏在進行類型轉換之前,會驗證指定操作可以在指定類型上安全地執行。如果宏不能執行指定操作,就會提供警告。因為GTK+ 使用方框布局 模型,所以不必顯式地指定部件應當放在屏幕上的什麼位置。相反,要指明部件放在其他哪個窗口部件內。在 Hello World 應用程序中,每個 gtk_container_add() 方法調用都告訴應用程序用第一個參數(或 雙親部件),並把第二個參數(或 子部件)放在雙親部件內。在這個示例中使用的 VBox 部件是一種布局部件,它垂直地排列子部件。這樣,在它內部放置標簽和按鈕時,結果就是按鈕顯示在標簽下。這是需要做的全部工作。如果您曾經用過絕對定位(在某些工具包中使用的模型,例如 Win32)手動調整部件或重新設置部件大小,那麼您會很高興知道在 GTK+ 中所有這些都是自動完成的。連接信號和主循環在創建並組織好部件之後,該給它們添加些邏輯了。GTK+ 像多數 GUI 工具包一樣,是一個事件驅動框架。所以,它是圍繞主循環 組織的。主循環在連續的檢查-分配-睡眠周期上操作。當事件發生時,與這個事件對應的對象發出信號,通知主循環事件已經發生。然後主循環查詢自己的信號和處理程序之間的內部映射表,也叫做 回調,並調用注冊到指定對象的指定信號的處理程序。在Hello World 代碼中,回調的注冊看起來像這樣:清單4. 回調的注冊 g_signal_connect(G_OBJECT (window), "delete-event", G_CALLBACK(cb_delete), NULL); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(cb_button_click), label); 請注意在 GTK+ 中,connect(連接) 到信號。第一行把 cb_delete 函數連接到 window 對象的 delete-event 信號。類似地,第二行把 cb_button_click 函數連接到 button 對象的 clicked 信號。請注意在第二個連接調用中的第四個參數 label。稍後會看到它在 cb_button_click 函數中是如何使用的。下面是 cb_delete 函數,它在用戶關閉窗口時退出應用程序: static gboolean cb_delete(GtkWidget *window, gpointer data) { gtk_main_quit(); return FALSE; } static 修飾符 在C 中,static 關鍵字在內部鏈接函數,這意味著靜態函數在聲明它的源文件之外不可見。除非需要在不止一個文件中使用回調,否則請一直使用 static 關鍵字聲明回調。使用這個方法,可以避免把可用函數名稱的有限名稱空間弄混亂。因為靜態函數被局限在一個文件,所以可以安全地重用函數名稱。 這個函數接受 GtkWidget* 和一個未指定的 data 指針(gpointer 是等價於 void* 的類型),因為 "delete-event" 的每個回調都必須符合這個原型。但是,這個函數不需要這些參數,所以它們被忽略了。它調用 gtk_main_quit() 常式以退出主循環。而且,該函數返回布爾值,因為為 GtkWidget 定義的 delete-event 信號的回調原型指明的是布爾返回值。布爾值決定 GTK+ 採取的行動。如果它返回 TRUE 值,那麼事件就被認為已經得到處理,而且不調用默認處理程序(該默認處理程序從窗口系統刪除部件)。有的時候,例如,如果想顯示一條消息,請求尚未保存的數據,並根據用戶的響應阻止窗口關閉,那麼這個函數會很有用。下面是 cb_button_click 函數,在用戶點擊按鈕時,它修改顯示的歡迎信息:清單5. cb_button_click 函數 static void cb_button_click(GtkButton *button, gpointer data) { GtkWidget *label = GTK_WIDGET(data); g_assert(label != NULL); gtk_label_set_text(GTK_LABEL (label), choose_greeting()); } 可以看到,這個函數與 cb_delete 函數類似,不同之處是它什麼也不返回,而且它接受 GtkButton* 而不是 GtkWidget。代碼把 data 轉換成到 GtkLabel 的指針。還記得在回調注冊中的 label 參數么?現在每次調用回調時,data 指針都會包含到那個標簽的指針。每當需要向回調傳遞額外的信息時,都可以使用 data 參數。類似地,如果需要訪問發出信號的對象,就要使用第一個參數,在這個具體回調中是 button。在得到標簽的指針後,代碼使用 g_assert 宏來確定標簽是否等於 NULL。g_assert 宏是一個來自 Glib (GTK+ 使用的一個有用的 C 類型和常式庫)的工具宏,如果傳遞給它的條件滿足,就會中止程序 —— 在這個示例中,條件是 label 等於NULL。因為 label 等於NULL 意味著程序員犯了錯誤,所以這可以確保在代碼投入生產之前捕獲到錯誤。顯示窗口在回調連接好之後,gtk_widget_show_all() 函數使窗口 —— 即所有的部件 —— 都顯示在屏幕上(參見圖 1)。圖1. Hello World 應用程序,用波蘭語和日語運行激活主循環當諸事就位,而且顯示出來之後,gtk_main() 函數就激活主循環。主循環進入無限循環,等候事件並調用回調,直到有人關閉窗口,調用 gtk_main_quit() 為止。注意:如果對代碼仍有問題,請參閱附帶的源代碼。它與文章中介紹的代碼完全相同,但是每一行都包含詳細的注釋。編譯和運行要編譯這個程序,需要 C 編譯器和 GTK+ 的開發文件(頭和庫)。有關如何獲取這些項目的信息,請參閱 參考資料。在安裝完文件之後,請解壓源代碼,進入源代碼將要解壓到的目錄,並運行 make: $ tar -xzf gtk_hello.tgz $ cd gtk_hello $ make 注意:如果正在運行 Microsoft�0�3 Windows�0�3,請不要運行 make,而是打開 Microsoft Visual Studio�6�4.NET 並運行 「hello」 項目。回頁首在其他編程語言中的 GTK+可以在多個編程語言中使用 GTK+。要做到這點,需要使用綁定。綁定 是針對指定語言的特殊包,它用適合該語言的方式公開 GTK+ API。例如,我已經把 Hello World 應用程序轉換成 Python 和 C#。要在這些語言中運行 GTK+,除了 Python 和 Mono/.NET 之外,分別還需要 PyGTK 和 Gtk#(請參閱 參考資料)。PyGTK 中的 Hello World 清單6 顯示了轉換成 Python 的 Hello World 應用程序的代碼。清單6. PyGTK 中的 Hello World 應用程序 import pygtk pygtk.require('2.0') import gtk import random greetings = ["Hello World", "Witaj ?wiecie", "世界に今日は"] def choose_greeting (greets): return greets[random.randint (0, len(greets) - 1)] def cb_clicked(button, label): label.set_text(choose_greeting(greetings)) window = gtk.Window () vbox = gtk.VBox () button = gtk.Button("Hello World") label = gtk.Label (choose_greeting (greetings)) window.add(vbox) vbox.add(label) vbox.pack_start(button, False, False) window.connect("delete-event", lambda a,b: gtk.main_quit()) button.connect("clicked", cb_clicked, label) window.show_all() gtk.main() 由於緊湊的 Python 代碼,應用程序的這個版本比它的 C 語言對應物更短。除此之外,看起來是相似的。注意,代碼被轉換成使用 Python 的習慣,但是 API 保持不變。Gtk# 中的 Hello WorldGtk# 中的 Hello World 應用程序代碼要比 C 版本略長,因為 C# 要求的聲明很長。所以,我沒有在這里包含完整的源代碼。源代碼包含在附加的下載中。下面快速查看一下 C 到 C# 的主要概念轉換: class GtkHello : Gtk.Window { 現在不再創建並設置新窗口,而是把 Gtk.Window 類放進一個子類,並把所有設置代碼移動到構造函數。這種方法並非特定於 Gtk#。實際上,在 C 程序中,當需要窗口的多個拷貝時,經常使用這種方法。但是,在 C# 中使用子類如此之容易,所以即使對一個實例這么做也有意義 —— 特別是在考慮到 C# 要求至少聲明一個類的時候,更是如此。 this.DeleteEvent += new DeleteEventHandler(DeleteCB); button.Clicked += new EventHandler(ButtonClickCB); 可以看到,GTK+ 信號被轉換成地道的 C# 事件概念。名稱也被稍加修改,以更好地符合 C# 的命名規范。清單7. GTK+ 信號被轉換成地道的 C# 事件概念 private void DeleteCB (object o, DeleteEventArgs args) { Application.Quit (); args.RetVal = true; } 由於C# 事件的構造方式,所以 delete-event 處理程序的原型略有不同。它不是從回調返回 true,而是通過 args.RetVal 傳遞返回值。gtk_main() 和gtk_main_quit() 分別被 Application.Run() 和Application.Quit() 代替。回頁首有用的工具在使用 GTK+ 進行開發時,有幾個工具可以讓工作輕鬆些。其中最著名的幾個工具是 Glade、Libglade 和 Devhelp。Glade 和 LibgladeGlade 是一個界面構建器 —— 這個程序可以圖形化地構建應用程序,而不必手動從源代碼開始構建。更重要的是第二個組件:Libglade。顧名思義,Libglade 支持讀取可擴展標記語言(XML)格式,Glade 用 XML 保存用戶界面描述。使用 Libglade,可以直接從這個描述構建應用程序的界面,而不需要任何代碼。圖2 顯示了一個包含幾個部件的簡單的 Libglade 應用程序。圖2. 簡單的 Libglade 應用程序清單8 顯示了圖 2 所示的 Libglade 應用程序的完整源代碼。清單8. Libglade 應用程序的源代碼 #include <gtk/gtk.h> #include <glade/glade.h> int main (int argc, char *argv[]) { GladeXML *ui; gtk_init(&argc, &argv); /* Read user interface description from glade file */ ui = glade_xml_new ("glade_hello.glade", "main_window", NULL); /* Automatically connect signals */ glade_xml_signal_autoconnect(ui); gtk_main(); return 0; } 可以看到,所有的事情只有 17 行代碼,包括注釋和空行。雖然真正的應用程序不會這么短,但是從代碼的清晰性、模塊性和可管理性來說,Libglade 帶來了巨大的提高。如果想進一步研究這個程序是如何構建的,可通過本文附帶的下載中其餘的示例進行了解。DevhelpDevhelp 是一個文檔瀏覽器,是為了閱讀用 gtk-doc 生成的格式的文檔而設計的,gtk-doc 是構建 GTK+ 文檔的標准工具,相關的項目,例如 Pango 和 GNOME 也使用它。使用 Devhelp,可以迅速地搜索函數索引並瀏覽已經安裝的文檔,從而可以更迅速地獲得需要的信息。Devhelp 是一個 GNOME 應用程序。所以,要運行它,需要一個符合 POSIX 的操作系統,在上面運行 GNOME,例如 linux�0�3 或 Sun Solaris,還需要 GNOME 運行時庫。不需要運行 GNOME 本身。如果使用其他平台,也有許多其他方法可以閱讀 GTK+ 文檔。Mono 項目有 Monodoc 瀏覽器,它通常是與 Gtk# 參考一起預先裝入的。GTK+ 的 Windows 安裝器也通常包含適合各種開發工具的文檔格式,例如 Visual Studio�0�3。最後,總有使用 Web 瀏覽器在線閱讀文檔這個選項,但是推薦採用專用瀏覽器,因為它的速度快,還有針對在程序文檔中進行搜索而設計的額外特性。下期預報在這篇文章中,學習了 GTK+ 編程中使用的基本概念。還看到了如何在 C 語言之外的語言中使用 GTK+,在保持使用 GTK+ 的一般方式的同時,還使用了特定於這些語言的方式。最後,還介紹了有助於更快更好地開發應用程序的工具。在本系列的最後一期中,將進一步觀察 GTK+ 開發的另一個方面:部署。文章將詳細分析各種選項,包括移植性的考慮和安裝的簡易。最後,將以更廣闊的視野來看 GTK+ —— 作為一個有活躍社區的項目,它有助於構建出更好地為用戶服務的應用程序。回頁首下載描述名字大小下載方法Source codeos-gtk2_hello.zip18KBHTTP關於下載方法的信息參考資料 學習您可以參閱本文在 developerWorks 全球站點上的 英文原文。 請閱讀 developerWorks 「GTK+ 基礎」 系列中的全部文章。 GNU Gettext 是一個用於應用程序運行時轉換的庫。 Libglade Reference Manual 是用來動態創建 GTK+ 界面的庫。 請訪問 GTK+ 獲得關於工具包的更多信息。 全面的 GTK+ API Documentation 對於所有開發人員都很重要。 Matthias Warkus 編寫的 The Official GNOME 2 Developer's Guide(No Starch Press,2004 年)介紹了 GNOME 2,包括使用 GTK+ 進行編程。 請訪問 developerWorks 開放源碼專區 獲得豐富的 how-to 信息、工具和項目更新,幫助您用開放源碼技術進行開發並把它們用於 IBM 的產品。 獲得產品和技術 請獲取 Gtk#,這是針對 Microsoft .NET 環境的 GTK+ 綁定。 請獲取 GTK+ 的官方 source code tarballs。 請訪問 PyGTK,這是 Python 的 GTK+ 綁定的官方站點。 Gazpacho 是Glade UI 描述文件的改進的編輯器,是用 PyGTK 編寫的。 Devhelp 是用於 GNOME 的一個面向程序員的文檔瀏覽器。 請參閱 GNOME,這是使用 GTK+ 構建的側重於應用的桌面。 請嘗試 Xfce,這是一個快速而易用的桌面,也是用 GTK+ 開發的。 請訪問 Gnomefiles 並得到超過 1,000 個用 GTK+ 構建的應用程序。 請用IBM 試用軟體 改造您的下一個開放源碼開發項目,這些軟體可以下載也可以通過 DVD 得到。 討論 請在GTK+ mailing lists 上獲得關於用 GTK+ 開發軟體的支持並詢問相關問題。 通過參與 developerWorks blogs 加入developerWorks 社區。 關於作者Maciej Katafiasz 是計算機科學專業的研究生,從高中起就一直使用開放源碼技術。從 GNOME 1.0 起,他就是 GNOME 桌面的用戶,而 2.0 版一發布,他就愛上了它並了解到 GTK+ 能夠開發自己喜歡的桌面。關閉[x]關於報告濫用的幫助報告濫用謝謝! 此內容已經標識給管理員注意。關閉[x]關於報告濫用的幫助報告濫用報告濫用提交失敗。 請稍後重試。關閉[x]developerWorks:登錄IBM ID:需要一個 IBM ID?忘記IBM ID?密碼:忘記密碼?更改您的密碼 保持登錄。單擊提交則表示您同意developerWorks 的條款和條件。 使用條款 當您初次登錄到 developerWorks 時,將會為您創建一份概要信息。您在developerWorks 概要信息中選擇公開的信息將公開顯示給其他人,但您可以隨時修改這些信息的顯示狀態。您的姓名(除非選擇隱藏)和昵稱將和您在 developerWorks 發布的內容一同顯示。所有提交的信息確保安全。關閉[x]請選擇您的昵稱:當您初次登錄到 developerWorks 時,將會為您創建一份概要信息,您需要指定一個昵稱。您的昵稱將和您在 developerWorks 發布的內容顯示在一起。昵稱長度在 3 至 31 個字元之間。 您的昵稱在 developerWorks 社區中必須是唯一的,並且出於隱私保護的原因,不能是您的電子郵件地址。昵稱:(長度在 3 至 31 個字元之間)單擊提交則表示您同意developerWorks 的條款和條件。 使用條款. 所有提交的信息確保安全。為本文評分評論回頁首
B. 如何在windows平台下配置gtk開發環境
GTK+開發環境搭建
「工欲善其事,必先利其器」首先介紹一下GTK+開發環境的搭建,網上很多所謂的GTK的開發環境的搭建基本都是抄來抄去,也不知道有沒有人使用他們介紹的方法搭建並編譯成功,很不幸的是我使用他們寫的方法沒有搭建成功,所以有必要再增加一個原創版本來介紹GTK+開發環境的搭建,這里介紹windows下兩種環境搭建的方法,ubuntu的我就不說了,apt-get的功能真是太強大,直接sudo apt-get install gtk+2.0就搞定了,使用gcc編譯添加編譯條件就沒問題了.現在說說windows吧!第一種是使用VS開發環境,我打算基於VS2012來講解,我的電腦里裝的是2012;另一種是使用codeblocks開發工具.
准備步驟一:
首先是gtk+開發包版本的選擇,這個非常重要,我在搭建的時候參考了非常多的資料,官方的資料、個人的心得,怎麼都沒有成功,最後偶然的機會發現是版本的問題。gtk+的官網上windows下的開發包分成32bit和64bit的,
網上我看到的文章說的都是根據自己的系統選擇開發包版本,我的系統是windows 8.1 x64 pro版本,足夠新了吧!很多軟體開發人員喜歡xp系統,但是我認為最新的東西才是適合軟體開發人員的,如果我們自己都固步自封,怎麼做出好的東西給客戶呢,新的東西雖然冒險,但是你可以根據自己項目的特點進行取捨,現在大家不喜歡用新東西的原因無非是出了問題無法很容易的找到解決方案,這個看自己了!我這是自己折騰著玩,沒有老闆在後面催著,所以我選擇最新的系統、最新的開發包。無論是你的系統是32bit還是64bit的,不要根據系統選擇開發包,要根據編譯器是32bit還是64bit來選擇開發包,無論VS2012還是codeblocks默認的編譯器都是32bit的,所以選擇32bit的開發包即可,由於gtk+是使用gcc編譯的或者minGW,使用VS2012的MS編譯器有點小問題,但是不影響使用。到www.gtk.org網站上下載gtk All-in-one bundle版本,這個版本打包了所有需要的文件,比較方便,我下載的是gtk+bundle_3.6.4-20130921_win32.zip和gtk+bundle_2.24.10-20120208_win32.zip是目前3.x和2.x最新的版本了。
為什麼下載2.x的是給codeblocks准備的,codeblocks不支持直接創建3.x版本的開發環境,但是支持從2.x版本直接創建gtk+工程,
這個稍後再講。現在開始:
准備步驟二:
將下載的開發包壓縮文件解壓縮到一個文件夾內,在環境變數的path下將這個文件夾下的bin目錄添加進去,
這個目錄是我試驗64bit時的截圖,不用糾結這個。
添加完成之後,你們可以試著運行bin目錄下的gtk3-demo.exe,如果配置沒有錯誤將會出現GTK+ Code Demos的窗口,這就說明你的配置是沒有錯誤的。
准備工作完畢,現在可以開始了。
VS2012搭建GTK+開發環境
1.新建一個空的C++項目,Visual C++—常規—空項目
2.右鍵項目—選擇「屬性」,打開屬性設置。
3.配置屬性—C/C++—常規—附加包含目錄—編輯
4.添加新行
將開發包的include文件夾添加進去,
需要添加的目錄有:
include,及include下的所有文件夾(atk-1.0,cairo,fontconfig,freetype2,gail-3.0,gdk-pixbuf-2.0,gio-win32-2.0,glib-2.0,jasper,libcroco-0.6,libpng15,librsvg-2.0,libxml2,lzma,pango-1.0,pixman-1),和lib文件夾下的glib-2.0\include、libffi-3.0.12\include(千萬不要忘記這兩個文件)。很不幸的是這些文件夾只能一個一個的添加,不能批量添加。添加完成之後會像這樣。
5.配置屬性—鏈接器—常規—附加庫目錄—編輯,將lib目錄添加進去
6.配置屬性—鏈接器—輸入—附加依賴項—編輯,將lib文件夾下則*.lib文件全部添加進去,我的lib目錄下有:
atk-1.0.lib
cairo.lib
fontconfig.lib
gailutil.lib
gdk_pixbuf-2.0.lib
gdk-win32-3.0.lib
gio-2.0.lib
glib-2.0.lib
gmole-2.0.lib
gobject-2.0.lib
gthread-2.0.lib
gtk-win32-3.0.lib
pango-1.0.lib
pangocairo-1.0.lib
pangoft2-1.0.lib
pangowin32-1.0.lib
添加完成之後像這樣:
每行回車,後面沒有「;」
7.新建一個main.cpp文件,在文件中輸入
復制代碼
代碼如下:
#include <stdlib.h>
#include <gtk/gtk.h></p> <p>static void helloWorld (GtkWidget *wid, GtkWidget *win)
{
GtkWidget *dialog = NULL;</p> <p> dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Hello World!");
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}</p> <p>int main (int argc, char *argv[])
{
GtkWidget *button = NULL;
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;</p> <p> /* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);</p> <p> /* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_window_set_title (GTK_WINDOW (win), "Hello World");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
gtk_widget_realize (win);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);</p> <p> /* Create a vertical box with buttons */
vbox = gtk_vbox_new (TRUE, 6);
gtk_container_add (GTK_CONTAINER (win), vbox);</p> <p> button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);</p> <p> button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
g_signal_connect (button, "clicked", gtk_main_quit, NULL);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);</p> <p> /* Enter the main loop */
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
然後運行,得到:
到此一個可以使用的VS的GTK+開發環境搭建完畢。這樣的步驟本人一步步試驗得來,應該沒有錯誤。可放心使用,哈!
codeblocks下搭建GTK+開發環境
我的codeblocks是12.11版本,是目前最新的codeblocks版本,如果使用2.x版本的GTK+那麼建立一個GTK+工程很容易。
1.選擇GTK+ progect
2.next—填寫工程名字
可以隨便填寫
3.選擇開發包的直接根目錄
如果出現上面的提示證明你使用的是3.x的開發包。出現上面錯誤是因為codeblocks的問題,你只需要重新指定一個指向2.x開發包的目錄即可。
選擇「next」,並點擊「finsh」,至此一個新的GTK+工程就完成了。
如果你原來添加到環境變數path下的目錄要更改成現在這個新目錄了,否則會有錯誤提示。
C. 在計算機技術中,什麼叫加殼和脫殼,能用通俗的話講出來嗎
加殼,的病毒好手工查殺和提取,脫殼,就把病毒外表的保護給去掉一般有5層,核心就是他的源代碼和病毒
流氓軟體就是破解後加入的
最早提出「殼」這個概念的,據我所知,應該是當年推出脫殼軟體 RCOPY 3 的作者熊焰先生。在幾年前的 DOS 時代,「殼」一般都是指磁碟加密軟體的段加密程序,可能是那時侯的加密軟體還剛起步不久吧,所以大多數的加密軟體(加殼軟體)所生成的「成品」在「殼」和需要加密的程序之間總有一條比較明顯的「分界線」。有經驗的人可以在跟蹤軟體的運行以後找出這條分界線來,至於這樣有什麼用這個問題,就不用我多說了。但畢竟在當時,甚至現在這樣的人也不是很多,所以當 RCOPY3 這個可以很容易就找出「分界線」,並可以方便的去掉「殼」的軟體推出以後,立即就受到了很多人的注意。老實說,這個我當年在《電腦》雜志看到廣告,在廣州電腦城看到標著999元的軟體,在當時來說,的確是有很多全新的構思,單內存生成 EXE 可執行文件這項,就應該是世界首創了。但它的思路在程序的表現上我認為還有很多可以改進的地方(雖然後來出現了可以加強其功力的 RO97),這個想法也在後來和作者的面談中得到了證實。在這以後,同類型的軟體想雨後春筍一般冒出來,記得住名字的就有: UNKEY、MSCOPY、UNALL .... 等等,但很多的軟體都把磁碟解密當成了主攻方向,忽略了其它方面,當然這也為以後的「密界剋星」「解密機器」等軟體打下了基礎,這另外的分支就不多祥談了,相信機齡大一點的朋友都應該看過當時的廣告了。
解密(脫殼)技術的進步促進、推動了當時的加密(加殼)技術的發展。LOCK95和 BITLOK 等所謂的「殼中帶籽」加密程序紛紛出籠,真是各出奇謀,把小小的軟盤也折騰的夠辛苦的了。正在國內的加殼軟體和脫殼軟體較量得正火紅的時候,國外的「殼」類軟體早已經發展到像 LZEXE 之類的壓縮殼了。這類軟體說穿了其實就是一個標準的加殼軟體,它把 EXE 文件壓縮了以後,再在文件上加上一層在軟體被執行的時候自動把文件解壓縮的「殼」來達到壓縮 EXE 文件的目的。接著,這類軟體也越來越多, PKEXE、AINEXE、UCEXE 和後來被很多人認識的 WWPACK 都屬於這類軟體,但奇怪的是,當時我看不到一個國產的同類軟體。
過了一段時間,可能是國外淘汰了磁碟加密轉向使用軟體序列號的加密方法吧,保護 EXE 文件不被動態跟蹤和靜態反編譯就顯得非常重要了。所以專門實現這樣功能的加殼程序便誕生了。 MESS 、CRACKSTOP、HACKSTOP、TRAP、UPS 等等都是比較有名氣的本類軟體代表,當然,還有到現在還是數一數二的,由台灣同胞所寫的 FSE 。其實以我的觀點來看,這樣的軟體才能算是正宗的加殼軟體。
在以上這些加殼軟體的不斷升級較勁中,很多軟體都把比較「極端」技術用了上去,因為在這個時候 DOS 已經可以說是給眾高手們玩弄在股掌之間了,什麼保護模式、反 SICE 、逆指令等等。相對來說,在那段時間里發表的很多國外脫殼程序,根本就不能對付這么多的加殼大軍,什麼 UPC、TEU 等等都紛紛成為必防的對象,成績比較理想的就只有 CUP386 了,反觀國內,這段時間里也沒了這方面的「矛盾斗爭」。加殼軟體門揮軍直搗各處要崗重地,直到在我國遇到了 TR 這個銅牆鐵壁以後,才紛紛敗下陣來各謀對策,但這已經是一年多以後的事情了。我常想,如果 TR 能早兩年「出生」的話,成就肯定比現在大得多,甚至蓋過 SICE 也有可能。TR 發表的時候 WIN95 的流行已經成為事實,DOS 還有多少的空間,大家心裡都清楚。但話又說回來, TR 的確是個好軟體,比起當年的 RCOPY3 有過之而無不及,同時也證明了我們中國的 CRACK 實力(雖然有點過時)。這個時候,前面提到過的 FSE 憑著強勁的實力也漸漸的浮出了水面,獨領風騷。其時已經是 1997 年年底了,我也走完了學生「旅程」。工作後在CFIDO 的 CRACK 區認識了 Ding-Boy ,不久 CRACK 區關了,我從此迷上了 INTERNET,並於98年6月建起了一個專門介紹「殼」的站台: http://topage.126.com ;;,放上了我所收集的所有「殼」類軟體。在這段時間里,各種「殼」類軟體也在不段的升級換代,但都沒什麼太大的進展,差不多就是 TR 和眾加殼軟體的版本數字之爭而已。
1998年8月,一個名為 UNSEC (揭秘)的脫殼軟體發表了,它號稱可以脫掉98年8月以前發表的所有殼。我測試之後,覺得並沒傳聞中的那麼厲害,特別是兼容性更是令我不想再碰它。 Ding-Boy 給這個軟體的作者提了很多建議,但寄去的 EMIAL 有如泥牛入海,可能是一怒之下吧,不久 Ding-Boy 的 BW (沖擊波)就誕生了。這個使用內存一次定位生成 EXE 文件(後來放棄了)的脫殼軟體,在我的站台公開後,得到了很多朋友們的肯定。要知道,從RCOPY 3 開始,絕大部分的脫殼軟體都是要兩次運行目標程序來確定 EXE 的重定位數據的。BW 的這一特點雖然有兼容性的問題,但也樹立了自己的風格、特色。經過幾個月的改善, BW 升級到了 2.0 版本,這個版本的推出可以說是 BW 的轉折點,因為它已經是一個成熟、穩定脫殼軟體了,它可以對付當時(現在)大多數的殼,包括當時最新的 FSE 0.6 等。更重要的是這個版本把選擇殼的和軟體「分界線」這個最令新手頭疼的步驟簡化到不能再簡化的地步,使更多的朋友接受了它。另外,能加強 BW 功力的 CI 模式也是其它脫殼軟體沒有的東西。最近,BW 發表了最新的 2.5 BETA2 版本,增強了一些方面的功能,因它竟然可以脫掉號稱最厲害的磁碟加密工具 LOCKKING 2.0 的加密殼,因而進一步奠定了它在「脫殼界」的地位。說到最新,就不能不提 GTR、LTR、EDUMP、ADUMP、UPS、UPX、APACK 這幾個國外的好軟體了,它們每個都有自己的特色,可以說都是當今各類「殼」中的最新代表了。(這些軟體和詳細介紹請到我的主頁查閱)
由於 WINDOWS 3.1 只是基於 DOS 下的一個圖形外殼,所以在這個平台下的「殼」類軟體很少,見過的就只有像 PACKWIN 等幾個有限的壓縮工具,終難成氣候。
可能是 MICROSOFT 保留了 WIN95 的很多技術上的秘密吧,所以即便是 WIN95 已經推出了 3 年多的時間,也沒見過在其上面運行的「殼」類軟體。直到 98 年的中期,這樣的軟體才遲遲的出現,而這個時候 WIN98 也發表了有一段日子了。應該是有 DOS 下的經驗吧,這類的軟體不發表由自可,一發表就一大批地的沖了出來。先是加殼類的軟體如: BJFNT、PELOCKNT 等,它們的出現,使暴露了 3 年多的 WIN95 下的 PE 格式 EXE 文件得到了很好的保護。大家都應該知道現在很多 WIN95 下的軟體都是用注冊碼的方法來區分、確定合法與非法用戶的吧,有了這類加殼軟體,這種注冊方法的安全性提高了不少,如果大家也有自己編的 WIN95 程序,就一定要多留意一下本類軟體了。接著出現的就是壓縮軟體了,因為 WIN95 下運行的 EXE 文件「體積」一般都比較大,所以它的實用價值比起 DOS 下的壓縮軟體要大很多,這類的軟體也很多,早些時候的 VBOX、PEPACK、PETITE 和最近才發表的 ASPACK、UPX 都是其中的佼佼者。在 DOS 下很流行的壓縮軟體 WWPACK 的作者也推出了對應 WIN95 版本的 WWPACK32,由於性能並不是十分的突出,所以用的人也不太多。由於壓縮軟體其實也是間接給軟體加了殼,所以用它們來處理 EXE 也是很多軟體作者喜歡做的事情,最近新發表的很多軟體里都可以看到這些加殼、加壓縮軟體的名字了。有加殼就一定會有脫殼的,在 WIN95 下當然也不例外,但由於編這類軟體比編加殼軟體要難得多,所以到目前為止,我認為就只有 PROCDUMP 這個軟體能稱為通用脫殼軟體了,它可以對付現在大多數的加殼、壓縮軟體所加的殼,的確是一個難得的精品。其它的脫殼軟體多是專門針對某某加殼軟體而編,雖然針對性強、效果好,但收集麻煩,而且這樣的脫殼軟體也不多。前些時候 TR 作者也順應潮流發表了 TR 的 WIN95 版本: TRW ,由現在的版本來看可以對付的殼還不多,有待改進。
BW 的作者 Ding-Boy 最新發表了一個 WIN95 的 EXE 加殼軟體 DBPE 。雖然它還不太成熟,但它可以為軟體加上使用日期限制這個功能是其它加殼軟體所沒有的,或者以後的加殼軟體真的會是像他說的那樣可以:加殼和壓縮並重、並施;隨意加使用日期;加上注冊碼;加軟體狗(磁碟)保護;加硬體序列號判
D. 脫殼能獲得源代碼嗎
加殼的全稱應該是可執行程序資源壓縮,是保護文件的常用手段.
加殼過的程序可以直接運行,但是不能查看源代碼.要經過脫殼才可以查看源代碼.
加「殼」其實是利用特殊的演算法,對EXE、DLL文件里的資源進行壓縮。類似WINZIP 的效果,只不過這個壓縮之後的文件,可以獨立運行,解壓過程完全隱蔽,都在內存中完成。解壓原理,是加殼工具在文件頭里加了一段指令,告訴CPU,怎麼才能解壓自己。加「殼」雖然增加了CPU附帶但是減少了硬碟讀寫時間,實際應用時加「殼」以後程序運行速度更快(當然有的加「殼」以後會變慢,那是選擇的加「殼」工具問題)。
一般軟體都加「殼」這樣不但可以保護自己的軟體不被破解、修改還可以增加運行時啟動速度。
加「殼」不等於木馬,我們平時的巨大多數軟體都加了自己的專用「殼」。
RAR和ZIP都是壓縮軟體不是加「殼」工具,他們解壓時是需要進行磁碟讀寫,「殼」的解壓縮是直接在內存中進行的,用RAR或者ZIP壓縮一個病毒你試試解壓縮時殺毒軟體肯定會發現,而用加「殼」手段封裝老木馬,能發現的殺毒軟體就剩不下幾個。
因為加殼了之後等於把這個文件進行了保護(就是有些殺毒軟體殺不了的原因)
因為文件不能重復加殼.判斷依據是文件是否已經加了保護
加殼其實主要就有兩個作用:
防止反編譯(破解軟體)和免殺
修改文件不一定要脫殼,看你的水平
些軟體加殼工具
1、軟體防盜版戰士
《軟體防盜版戰士》是一個以數字許可的形式為MicrosoftWindows下(PE格式)應用程序提供版權保護以及數字化銷售支持的純軟體產品。它含有認證版、序列號版這兩個可選版本。認證版以128位二進制證書文件作為被保護軟體的最終用戶使用許可,並且主要以最終用戶的硬碟、CPU、網卡及操作系統等特徵信息為版權保護的安全源(保守地說,理論上認證版的版權保護強度達到3-5年內不可破解)。
安全指標:1、對象安全強度——《軟體防盜版戰士》的各種對象安全都盡可能地加入了加密演算法中,其強度相當於對稱演算法的128位加密,比普通硬體狗的8位、16位、32位和64位(很少有64位的)安全強度強許多。2、入口安全強度——《軟體防盜版戰士》採用功能相關法解決入口安全問題。入口安全的最小復雜度大於40位的安全強度。《軟體防盜版戰士》的入口安全強度最大限定為128位(含128位)。
2、比泰軟體防盜版戰士2005J
比泰軟體防盜版戰士2005J(BS-APC),是比泰科技出品的一個軟體加密保護產品系列(含L版、A版、J版等產品線),它們為商業軟體提供可靠的防盜版保護並支持數字化發行。|它採用比泰公司世界領先的「執行代碼抽取加密」技術,軟硬體結合,以「認證技術」保證軟體「對象安全」、以「功能相關法」保證軟體「入口安全」、以具有唯一性的計算機(物理)特徵數據作為身份認證指紋,並以軟體用戶計算機本身的運算能力進行防盜版保護。具有64位以上,到128位的加密安全強度。安全強度遠勝傳統的外殼加密式加密狗、API內嵌式加密狗,軟體保護的功能范圍及運行效率超過智能狗,且無須學習加密狗編程,不引入附加硬體維護問題。|適合對C/MFC/VisualC++(VC++)/BorlandC++Builder(BCB)、Delphi/ObjectPascal、PowerBuilder(PB)、Authorware、Director等開發工具所編譯程序的保護。|因為它是對真實指令進行代碼抽取加密,因此暫不保護偽編譯程序,如VB、VFP、C#、java。
3、AntiCrackProtector
ACProtect是由國人研究開發並擁有自主知識產權的加密軟體精品,它有許多技術已經達到並超過了國外同類產品,是一個為Windows下的EXE/DLL/OCX/SCR等32位可運行文件加密系統。它通過為程序加上一層堅硬的保護殼,可以非常有效的防止盜版。還可以為程序設置限制注冊功能。
即使你沒有程序的原代碼,你也可以用ACProtect在程序上加上運行次數限制,運行天數限制,運行有效日期限制。通過公匙加密演算法(RSA)創建並校驗注冊KEY,只有在RSAKEY正確的情況下,才對那些受保護的代碼進行正常解碼。同時使用了內嵌式加密,可以有效的防止加密軟體從內存中被抓取,也就是無法被脫殼。
內置反調試引擎,有效的增加了破解的難度。
專用的API系統,可以使ACProtect和你的軟體緊密的接合在一起,這樣,你就可以通過使用ACProtect來創建你的全功能評估版。
4、XQBOX軟體保護安裝系統
XQBoxSoftwareProtecting是一個以數字許可的形式為應用程序提供版權保護以及數字化銷售支持的純軟體產品。它採用機器具有唯一性的數據做指紋,利用宿主計算機的運算能力進行防盜版保護。
XQBox保護系統是集軟體保護和安裝工具於一身的集成工具。XQBox核心代碼是遵守標准c的規則來編寫,它可以在,windows3.x/9x/2000/nt,unix,linux等各種操作系統下編譯運行。作為中間件,它可在c、c++、java、delphi、vc、vb、vf、Masm32、pb、php、Authorware等。各種工具開發的軟體中嵌入使用,它的兼容性非常好。核心代碼經全域均勻抽值測試,各種特值測試和可行的全域測試均通過。
5、秦贏甲胄反盜版加密軟體
這款反盜版軟體的用戶注冊方便,終端用戶不需要手動輸入序列號認證碼等等,一切由注冊端軟體自動完成;用戶機器的硬體信息作為注冊碼/加密密鑰;一個拷貝只能在同一台機器上注冊;只要是同一台機器,可以在這台機器上注冊多次;只能在注冊的那台機器上運行
使用理論上安全的密碼學協議和演算法,保證不可離線破解。不能通過注冊機破解;不能通過散發序列號破解。
更改檢測(可以檢測病毒和破解者更改);反跟蹤功能(Anti-Debug)。
運行時代碼完整性校驗,可防止Cracker跟蹤時設置斷點;可防止通過補丁程序破解。
反Dump功能(Anti-Dump);反反匯編功能(Anit-Disassembler);可以有效的管理經銷商和序列號的發放;可以統計軟體的銷售數量;可以有效的管理用戶注冊。
6、PE加密保護軟體EncryptPE
EncryptPE能加密保護常規PE文件(EXE、DLL、OCX等一般程序或NT服務程序),防靜態分析修改,反動態跟蹤調試,有效地保護軟體,防止盜版。除常規的對抗調試器(SoftIce、TRW、OllyDbg等)、監視器、DUMP工具方法外,EncryptPE採用的加密保護的手段還有:隨機加密演算法、CRC校驗、變形、代碼替換、進程注入、APIHOOK、多線程、調試運行、全程監控等。
能將普通軟體變成共享軟體,增加定時注冊提醒、限制試用日期、限制試用次數、限制試用天數、限制每次試用多長時間等功能。
能根據最終用戶的機器信息、注冊用戶及加密時的保護密碼計算注冊碼,從諸多加密演算法中隨機選擇一種用於注冊碼的計算。
支持多語言,並為待加密軟體提供多語言介面。
向待加密軟體提供豐富的方便的編程介面,便於設計個性注冊方式,同時使被加密程序與加密殼之間融為一個整體,增加破解難度。
可以運行於多種Windows平台,包括9X/ME/NT/2000/XP/2003。
7、注冊碼生成器
本軟體可以自動隨機生成2至32位注冊序列號及對應的注冊碼,並將這些注冊信息包含到一個動態聯接庫DLL文件中,這樣軟體開發者可以將這個DLL文件同應用程序一並發行,並在應用程序的相關模塊中調用這個DLL文件中提供的函數獲得注冊號及相對應的注冊碼,注冊號及相對應的注冊碼對軟體使用者來說是不透明的,它可以用效的避免軟體的盜版及其重復注冊,切實保護軟體開發者的版權。隨軟體一同提供免費的DLL源程序生成器工具,DLL注冊碼查詢工具,啟動應用程序時的注冊對話框示常式序及全部C++源代碼等。
8、計算機軟體防盜版
計算機軟體防盜版系統具有國際領先水平的保護知識產權的新技術。現該技術已順利完成了全部研製。利用嵌入式加密,動態激活解密,工具化設計特徵,檢測體系,產品形態技術。於1999年7月通過公安部計算機信息安全檢測中心的檢測。計算機軟體防盜版磁碟、光碟獲公安部頒發的計算機信息安全產品銷售許可證。
E. Ubuntu 13.10不能啟動VirtualBox怎麼辦
我們都知道VirtualBox是一款虛擬機,能夠在Ubuntu系統中運行,但在Ubuntu 13.10運行的時候提示錯誤,導致VirtualBox無法啟動,遇到這個問題怎麼辦?下面小編就給大家介紹下Ubuntu13.10不能啟動VirtualBox的解決方法。
最近需要在若干虛擬機進行Hadoop的調試,於是就在Ubuntu上安裝VirtualBox虛擬機,可是碰到了虛擬機無法啟動的問題:
界面上會彈出一個錯誤對話框,錯誤信息如下:
Kernel driver not installed (rc=-1908)
The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Re-setup the kernel mole by executing
『/etc/init.d/vboxdrv setup』
as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel mole if necessary.
首先匯總一下系統環境:ubuntu desktop 13.10, virtualbox-4.3, kernel: 3.11.0-17
1. 按照這個錯誤指示,我就切換到命令行,
sudo /etc/init.d/vboxdrv setup
得到如下的錯誤信息:
提示依然無法正常載入dkms,而且好像需要當前內核的源代碼進行編譯,同時,提示查看/var/log/vbox-inuntustall.log日誌。
2. 於是,cat /var/log/vbox-install日誌
Uninstalling moles from DKMS
removing old DKMS mole vboxhost version 4.3.8
------------------------------
Deleting mole version: 4.3.8
completely from the DKMS tree.
------------------------------
Done.
Attempting to install using DKMS
Creating symlink /var/lib/dkms/vboxhost/4.3.8/source -》
/usr/src/vboxhost-4.3.8
DKMS: add completed.
Failed to install using DKMS, attempting to install without
Makefile:183: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=《directory》 and run Make again. Stop.
3. 檢查dkms,正常安裝;反復安裝virtualbox,確保不是安裝不完整造成的問題。
sudo apt-get install dkms
提示已經安裝到最新版本,說明應該不是dkms的問題。
4. 查看內核版本 uname -r, 得到當前的kernel版本: 3.11.0-17-generic.
5. 搜索了一下網路,有人提示說,可能需要重新安裝一下內核。
sudo apt-get install linux-headers-$(uname -r)
注意: ${uname -r}用來代表當前內核的版本,不能直接在命令中使用的,這里我的版本是step 4中的輸出。
6. 按照之前的問題提示,重新運行 sudo /etc/init.d/vboxdrv setup
~$ sudo /etc/init.d/vboxdrv setup
Stopping VirtualBox kernel moles 。。.done.
Uninstalling old VirtualBox DKMS kernel moles 。。.done.
Trying to register the VirtualBox kernel moles using DKMS 。。.done.
Starting VirtualBox kernel moles 。。.done.
提示: 已經正常將virtualbox模塊注冊到kernel中了
7. 接下來就可以點擊virtualbox的啟動按鈕,正常啟動virtualbox中的虛擬機了。
8. 原因分析:
最後我嘗試分析了一下,產生這個錯誤的原因:之前的virtualbox是可以正常工作的,後來升級ubuntu和內核版本之後,估計打破了virtualbox和內核之前的注冊系統,就是原有的注冊在新的內核中失效了,同時,現在的內核可能在升級過程,有若乾的不穩定情況。 所以,需要重新覆蓋安裝內核,然後,再一次將virtualbox內核注冊到當前linux內核之中,以上僅為猜測,歡迎大家提出新的想法和推測。
上面就是Ubuntu 13.10不能啟動VirtualBox的解決方法的介紹了,該問題主要出現在Ubuntu 13.10版本中,且是在升級內核版本所導致。
返回系統之家首頁