как обрабатывать ошибки «неопределенный символ» для несовпадающих общих объектов - PullRequest
1 голос
/ 30 марта 2011

Я разработал приложение с использованием недавнего Glade, поэтому мне нужно, чтобы оно загружало пользовательский интерфейс из XML во время выполнения, используя GtkBuilder.Если я попытаюсь запустить его на дистрибутиве со слишком старым Gtk (например, RHEL 5), он потерпит неудачу, как этот

неопределенный символ: gtk_builder_new

, что является нормальным и ожидаемым.Но мне интересно, есть ли способ отловить эту ошибку и вместо этого отобразить диалоговое окно с ошибкой графического интерфейса, говорящее что-то вроде: «Ваша версия Gtk недостаточно новая»?Это ошибка, которая происходит до того, как мой main () запускается, так что вопрос в том, есть ли способ обработки ошибок компоновки во время выполнения?Во время поиска в Google я нашел упоминание о концепции плагина линкера, но пока не нашел подробностей об этом.Похоже, что-то, что должно было бы существовать вне моего приложения в любом случае, так что, возможно, это зашло бы немного дальше.

Я мог бы использовать dlopen () для загрузки Gtk, но это нелепо, потому что мне пришлось бы дать полнуюпуть к нему, и тогда мне придется многократно вызывать dlsym (), чтобы связать каждую нужную мне функцию.ld-linux.so ищет меня.Есть ли способ, которым я могу использовать ld-linux.so, чтобы сообщить мне путь к libgtk без фактической загрузки, затем я проверяю, является ли версия достаточно новой (или просто существует gtk_builder_new), а затем заканчиваю компоновку во время выполнения, если все в порядке?

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Ну, это не работает в дистрибутиве Linux. По сути, вы обходите менеджер пакетов.

Хороший способ - собрать программное обеспечение на целевом дистрибутиве. Во время настройки (позвоните по адресу ./configure) вы увидите, что требования для использования вашего программного обеспечения не выполнены. Или, если у вас нет скрипта configure, компилятор будет кричать во время ссылки.

Тогда работа упаковщика заключается в том, чтобы заполнить требование пакета. Если в файле .spec вашего RPM-пакета вам потребуется gtk> = 2.16, то во время установки пользователю будет показано диалоговое окно с сообщением о том, что некоторые зависимости отсутствуют, и он увидит, что его версия GTK слишком старая.

1 голос
/ 31 марта 2011

Похоже, вы говорите о ситуации, когда вы скомпилировали заголовки с достаточно свежей версией, но работаете в системе, где ваша библиотека недостаточно свежая.

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);
}
0 голосов
/ 30 марта 2011

Вот обходной путь, который может помочь: переименуйте ваш 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
 }

[EDIT] В качестве альтернативы, вы можете создать действительно маленькую тестовую программу, которая просто содержит вызов gtk_builder_new и запустить его во время установки или в тестовом скрипте.

Таким образом, вам не нужно проверять конкретное сообщение об ошибке (которое может быть переведено в неанглийских системах). Если эта небольшая тестовая программа не пройдена, вы можете быть уверены, что это из-за пропущенного символа и ничего больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...