2012-04-21 15 views
5

私はGTKアプリケーションを起動するときに読み込まれるカスタムGTKモジュールを作成したいと思います。GTKモジュールの作成とロード方法は?

このトピックに関するドキュメントはまれですが、私は多くを検索しましたが、動作させることができませんでした。私はGTK3でUbuntu Linuxの上だと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; 
} 
  • アプリケーションを起動しようとしました/usr/lib/x86_64-linux-gnu/gtk-3.0/modules/libtest-gtk-module.so
  • にこのLIBを入れてこのように:gnomine --gtk-module=libtest-gtk-module.soしかし、私が得るすべてである:Gtk-Message: Failed to load module "libtest-gtk-module.so"

だから、他に何がGTKは、このライブラリをロードするようにするために行う必要がありますか?

事前に感謝します。

答えて

2

システムにライブラリを認識させる必要があります。システムディレクトリのライブラリでは、ldconfigをrootとして実行するだけで十分です。チュートリアルhereを見てください。

[EDIT]

私は次のようにロードするために、モジュールを得た:

  • これは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

+0

+1 @Simme:編集を確認してください。おそらくあなたの問題は、名前のマングリング問題でした。 'readelf'や他のユーティリティを使って、' gtk_module_init'(任意の接頭辞/接尾辞、すなわちmanglingを除く)シンボルが存在するかどうかを調べることができます –

0

は、straceのとそれを実行してみ:

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

あなたはあなたのプログラムがそのファイルを探している場所を見つけることができます。

関連する問題