8

我想创建一个自定义 GTK 模块,当我启动 GTK 应用程序时应该加载该模块。

关于这个主题的文档很少,我搜索了很多,但我没有让它运行。我在带有 GTK3 的 Ubuntu Linux 上尝试过:

  • 用里面的方法编译和链接一个共享库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;
}
  • 将此库放入 /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 加载这个库,还需要做什么呢?

提前谢谢了!

4

2 回答 2

3

您需要让系统知道该库。对于系统目录中的库,以 root 身份运行 ldconfig 就足够了。看看这里的教程。

[编辑]

我让模块加载如下:

  • 由于这是 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
    

这是在 Mint LMDE 上,而不是在 Ubuntu 上,但我认为这并不重要。

于 2012-04-21T18:00:12.200 回答
0

尝试使用 strace 运行它:

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

你会发现你的程序在哪里寻找那个文件。

于 2012-04-23T08:28:00.920 回答