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

システムにライブラリを認識させる必要があります。システム ディレクトリ内のライブラリの場合、ルートとして 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
    

これは Ubuntu ではなく Mint LMDE にありますが、問題ではないと思います。

于 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 に答える