2012-04-21 72 views
5

我想創建一個自定義的GTK模塊,當我啓動一個GTK應用程序時應該加載它。如何創建和加載GTK模塊?

有關此主題的文檔很少,我搜索了很多,但未能使其運行。我在Ubuntu Linux上使用GTK3並嘗試使用sofar:

  • 編譯並鏈接共享庫的方法void gtk_module_init(gint *argc, gchar ***argv[])裏面。據我瞭解,這應該足以創建一個簡單的模塊。全碼:
#include <iostream> 
#include <gtk/gtk.h> 

void gtk_module_init(gint *argc, gchar ***argv[]) { 
    std::cout << "huhu" << std::endl; 
} 
  • 將這個lib放到/usr/lib/x86_64-linux-gnu/gtk-3.0/modules/libtest-gtk-module.so
  • 試圖推出一個應用程序像這樣:gnomine --gtk-module=libtest-gtk-module.so但我得到的是:Gtk-Message: Failed to load module "libtest-gtk-module.so"

那麼還有什麼是爲了讓GTK加載該庫做?

非常感謝提前!

回答

2

您需要讓系統知道庫。對於系統目錄中的庫,它應該足以以root用戶身份運行ldconfig。看看教程here

[編輯]

我要加載的模塊如下:

  • 由於這是C++代碼,你需要確保功能名稱不上名字錯位:

    extern "C" { 
    void gtk_module_init(gint *argc, gchar ***argv[]) { 
        std::cout << "huhu" << std::endl; 
    } 
    } 
    
  • 我建立它具有以下:

    g++ -fPIC -shared -Wl,-soname,libfoo.so.1 -olibfoo.so.1.0.1 `pkg-config --libs --cflags gtk+-3.0` t.c 
    
  • 我使用絕對路徑,以避免與LDCONFIG搞亂,這可能是在開發的模塊做的最好的事情:

    ~$ gedit --gtk-module=/home/eric/libfoo.so.1.0.1 t.c 
    huhu 
    

這是薄荷LMDE,不Ubuntu的,但我不我認爲這很重要。

+0

嗯,我試過了。但沒有成功。也許模塊有一些錯誤? GTK提供的錯誤並不是非常有用......並且感謝鏈接,它似乎相當有用! – Simme 2012-04-22 07:52:04

+0

+1 @Simme:請檢查編輯。最有可能你的問題是與名稱問題。您可以使用'readelf'或其他這類實用程序來檢查是否存在'gtk_module_init'(就像沒有任何前綴/後綴,即mangling)符號一樣 – 2012-04-23 15:58:22

0

嘗試使用strace的運行:

strace -eopen add_your_command_here 2>&1 | grep libtest-gtk-module.so 

你會發現你的程序正在尋找該文件。