2012-04-21 71 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 

你会发现你的程序正在寻找该文件。