Встроенное приложение C работает внутри папки, в которую оно было встроено, терпит неудачу при переносе за ее пределы

Я делаю приложение на C, и я создал его с помощью следующей команды:

gcc `pkg-config --cflags gtk+-3.0` main.c -o hello `pkg-config --libs gtk+-3.0` -lX11 -rdynamic

И это работает, круто! За исключением... когда я пытаюсь скопировать экспортированный файл в другую папку, например /usr/bin, возникают следующие ошибки:

(hello:11178): GLib-GObject-WARNING **: 16:35:55.999: invalid (NULL) pointer instance

(hello:11178): GLib-GObject-CRITICAL **: 16:35:55.999: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

(hello:11178): Gtk-CRITICAL **: 16:35:55.999: gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed

Вот мой код. Игнорируйте файл мезона. https://github.com/JohnyTheCarrot/Paperplane

пакет-конфигурация:

-pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/libdrm -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/uuid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include```

person JohnyTheCarrot    schedule 02.10.2019    source источник
comment
Можете ли вы показать нам, что выводит pkg-config --cflags gtk+-3.0?   -  person John    schedule 02.10.2019
comment
Я точно могу! Добавил в пост внизу. Спасибо за ответ!   -  person JohnyTheCarrot    schedule 02.10.2019
comment
Как насчет того, чтобы скопировать исполняемый файл в другой каталог из дома, например ~/local/bin ? Я подозреваю, что это может быть проблема с привилегиями.   -  person John    schedule 02.10.2019
comment
Привет, я не нашел этот каталог, поэтому я создал его. Кажется, я все еще получаю ту же ошибку.   -  person JohnyTheCarrot    schedule 02.10.2019
comment
Я бы посыпал функции option_open и main с помощью printfs и посмотрел, что установлено для homedir.   -  person John    schedule 02.10.2019
comment
Если вы не получите ответа, я попробую создать приложение сегодня вечером и посмотрю, не появятся ли те же ошибки.   -  person John    schedule 02.10.2019
comment
Когда это работает или когда это не так? Когда он работает, он возвращает /home/johnythecarrot.   -  person JohnyTheCarrot    schedule 02.10.2019
comment
Так что, когда это не работает, вы даже не добраться туда? Я предполагаю, что у вас есть fflush(stdout) на месте.   -  person John    schedule 02.10.2019
comment
Привет, кажется, что код работает, но не показывает окно приложения. К сожалению, я даже не знаю, что такое fflush(stdout).   -  person JohnyTheCarrot    schedule 02.10.2019
comment
fflush(stdout) просто проверяет, что printf печатаются, прежде чем продолжить.   -  person John    schedule 02.10.2019
comment
О, я делаю \n, и это, кажется, печатает их.   -  person JohnyTheCarrot    schedule 03.10.2019


Ответы (1)


Я не тестировал код, но вижу, что вы открываете файлы, сгенерированные Glade, используя относительный путь. Все ваши звонки gtk_builder_add_from_file выглядят так:

gtk_builder_add_from_file (builder, "main_window.glade", NULL);

Если вы переместите только свой двоичный файл, он больше не сможет найти эти файлы. Один из способов избежать этого — указать путь в файле meson. чтобы вы могли использовать его в своем коде.

Кроме того, вам нужно сделать некоторые надлежащие проверки ошибок. Там, где запрашивается GError **error, используйте его и проверяйте наличие ошибок вместо передачи NULL и печатайте сообщение, возвращаемое GError, это сэкономит вам много времени.

guint
gtk_builder_add_from_file (GtkBuilder *builder,
                           const gchar *filename,
                           GError **error);

Для получения дополнительной информации прочитайте, как работает GError (см. " раздел «Описание»).

person liberforce    schedule 03.10.2019
comment
Привет! Спасибо за Ваш ответ. Кажется, я получаю следующую ошибку в мезоне: фатальная ошибка: gtk/gtk.h: нет такого файла или каталога - person JohnyTheCarrot; 03.10.2019
comment
Конечно. Вы должны объявить свои зависимости, а затем использовать их в executable, а не наоборот. Исполняемый файл имеет зависимости, что имеет смысл. Я также не понимаю, почему вы вызываете pkg-config в add_project_arguments, это не имеет смысла. Meson уже знает о pkg-config и знает, как его вызвать. Пожалуйста, прочтите пример базового приложения GTK+ с Meson на веб-сайте Meson. - person liberforce; 04.10.2019
comment
Спасибо! Я признаю, что я идиот, но я не понимаю, как сослаться на путь в моем файле мезона с помощью ссылки, которую вы мне дали. Извини. - person JohnyTheCarrot; 04.10.2019
comment
Вы должны прекратить загрузку по файлу и загрузить с помощью GResource: developer.gnome.org/gio/stable /GResource.html - mesonbuild.com/Gnome-module.html#gnomecompile_resources - person TingPing; 05.10.2019
comment
Предложение GResource сработало, и моя проблема решена. Всем привет! - person JohnyTheCarrot; 06.10.2019
comment
@JohnyTheCarrot: извини, не хотел показаться резким. Вам нужно сначала объявить свою зависимость (что-то вроде gtk_dep = dependency('gtk+-3.0')), затем вы можете передать эту переменную gtk_dep в свой вызов executable(...). Таким образом вы даете исполняемому файлу список его зависимостей, иначе он их не найдет. В настоящее время ваш код выполняет только executable('build_test', 'main.c') и игнорирует параметр dependencies для executable(...). Посмотрите на базовый пример, который я привел выше. Он вызывает executable('demo', 'main.c', dependencies : gtkdep), предоставляя зависимости для исполняемого файла. - person liberforce; 07.10.2019
comment
О, не беспокойтесь об этом, вы не были суровы! :) - person JohnyTheCarrot; 08.10.2019