1

最近のGladeを使用してアプリケーションを開発したので、GtkBuilderを使用して実行時にXMLからUIをロードする必要があります。Gtkが古すぎるディストリビューション(RHEL 5など)でこれを実行しようとすると、次のように失敗します

未定義のシンボル:gtk_builder_new

これは正常であり、予想されます。しかし、そのエラーをキャッチして、代わりに「Gtkのバージョンが十分に新しくない」などのGUIエラーダイアログを表示する方法があるのだろうか?これは、main()が開始する前に発生するエラーです。したがって、実際の問題は、実行時のリンクエラーを処理する方法があるかどうかです。グーグルをしているときに、リンカープラグインの概念についての言及を見つけましたが、それについての詳細はまだ見つかりませんでした。とにかく私のアプリケーションの外に存在しなければならない何かのように聞こえるので、多分それは少し遠いです。

dlopen()を使用してGtkをロードすることもできますが、フルパスを指定する必要があり、必要なすべての関数をリンクするためにdlsym()を何度も呼び出す必要があるため、これはばかげています。ld-linux.soが検索を行います。ld-linux.soを使用して実際にロードせずにlibgtkへのパスを教えて、バージョンが十分に新しいかどうか(またはgtk_builder_newが存在するかどうか)を確認し、問題がなければランタイムリンクを終了する方法はありますか?

4

3 に答える 3

1

Linuxディストリビューションではそのようには機能しません。基本的に行っているのは、パッケージマネージャーをバイパスすることです。

良い方法は、ターゲットディストリビューションでソフトウェアをビルドすることです。構成時に(./configureを呼び出す)、ソフトウェアを使用するための要件が​​満たされていないことがわかります。または、configureスクリプトがない場合、コンパイラはリンク時に大声で叫びます。

次に、パッケージの要件を入力するのはパッケージャーの仕事です。RPMパッケージの.specファイルでgtk>=2.16が必要な場合、インストール時に、いくつかの依存関係が欠落していることを通知するダイアログがユーザーに表示され、GTKバージョンが古すぎることがわかります。

于 2011-03-30T15:00:20.800 に答える
1

十分に新しいバージョンのヘッダーに対してコンパイルしたが、ライブラリが十分に最近ではないシステムで実行している状況について話しているようです。

GTKは、ライブラリの新しい十分なバージョンに対してリンクしたことを確認するための機能を提供します。たとえば、少なくともGTK 2.12(GtkBuilderが導入されたバージョン)が必要な場合は、このコードを使用して、優れたGUIエラーダイアログを表示することもできます。

if (gtk_major_version < 2 || gtk_minor_version < 12) {
    GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
        GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
        "Your version of GTK is too old to run this program.");
    gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
        "You need at least version 2.12.0; your version is %d.%d.%d.",
        gtk_major_version, gtk_minor_version, gtk_micro_version);
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
    exit(-1);
}
于 2011-03-30T20:10:28.463 に答える
0

役立つ可能性のある回避策は次のとおりです。exeの名前を変更し、それを呼び出すbashスクリプトを作成します。

今、あなたはこれを行うことができます:

 EXE=...name-of-your-real-executable...
 LOG=logfile

 $EXE > "$LOG" 2>&1 || {
     if grep "undefined symbol: gtk_builder_new" "$LOG" ; then
         ... show error message ...
     fi
 }

[編集]gtk_builder_newあるいは、インストール中またはテストスクリプトでの呼び出しを含み、それを実行するだけの非常に小さなテストプログラムを作成することもできます。

そうすれば、特定のエラーメッセージ(英語以外のシステムでは翻訳される可能性があります)を確認する必要はありません。この小さなテストプログラムが失敗した場合は、このシンボルが欠落しているだけで、他には何もないことが原因であると確信できます。

于 2011-03-30T08:23:07.070 に答える