Приложение Gtk C - установите PWD, чтобы изображения работали

У меня есть простое приложение с графическим интерфейсом Gtk, написанное на C. Я хочу иметь возможность отображать внешние изображения внутри фрейма в моем главном окне. Код для этого выглядит следующим образом:

GtkWidget myImage;
myImage = gtk_image_new_from_file("assets/image.png");
gtk_fixed_put(FTK_FIXED(frame), myImage, 0, 0));

Изображение отображается, как и ожидалось, но только если я cd перехожу в каталог, в котором оно существует. то есть:

cd /tmp/bin/
./gtktest

Если я запускаю его из другого места, например, так, изображение никогда не будет найдено.

/tmp/bin/gtktest

Есть ли способ, чтобы приложение установило текущий рабочий каталог (PWD) в местонахождение самого двоичного файла?

Спасибо.


person Cloud    schedule 21.02.2014    source источник


Ответы (3)


Вы используете относительный путь к cwd, но вам нужно использовать либо относительный путь, основанный на расположении двоичного файла программы, либо абсолютный путь, основанный на корне файловой системы, например /usr/lib/yourprogram/assets.

Если вы хотите построить относительный путь на основе местоположения двоичного файла, что может быть более гибким в некоторых ситуациях, вам следует использовать dirname(). Как это:

char *my_location = dirname(argv[0]); // argv[0] contains the path to the binary

Проверьте man 3 dirname для получения дополнительной информации.

person hek2mgl    schedule 21.02.2014
comment
Также упомянем, что если вы используете систему сборки GNU, вы можете настроить путь во время сборки, например ./configure --with-assets=/usr/lib/ . Это путь, если вы хотите создавать пакеты ОС из программного обеспечения. - person hek2mgl; 21.02.2014

Поместите ресурсы в GResource и скомпилируйте их непосредственно в свою программу.

person ptomato    schedule 23.02.2014
comment
Хотя ответ hek2mgl является наиболее прямым, я, скорее всего, в конечном итоге воспользуюсь именно этим подходом. Спасибо. - person Cloud; 24.02.2014

Вы можете вызвать chdir(2) из вашей программы Gtk, или его оболочка Glib g_chdir

person Basile Starynkevitch    schedule 21.02.2014