Заголовочные файлы в подкаталогах (например, gtk/gtk.h или gtk-2.0/gtk/gtk.h)

Я пытаюсь создать приветственный мир с помощью GTK, который включает строку:

#include <gtk/gtk.h>

как и следовало ожидать.

В предоставленном Makefile есть строка:

GTK_INCLUDE = -I/usr/local/include

поэтому он ожидает найти gtk.h в /usr/local/include/gtk/gtk.h. Однако в моей системе он находится в /usr/local/include/gtk-2.0/gtk/gtk.h, то есть в подкаталоге с версией.

Очевидно, что в этом случае я могу добавить -I/usr/local/include/gtk-2.0 в Makefile, но та же проблема возникает с зависимостями gtk.h и так далее.

Есть ли хороший способ справиться с этим? Можно ли использовать configure для определения местоположения файлов заголовков и добавления соответствующих каталогов включения? Я почти ничего не знаю о настройке, но, похоже, она узнает что-то о системе во время сборки, что мне и нужно.

Это обычное явление или у меня какая-то странная структура каталогов, которая и является настоящей проблемой?

Спасибо за любые указатели!


person Ray2k    schedule 24.06.2009    source источник
comment
Дубликат: stackoverflow.com/questions/510098   -  person ephemient    schedule 25.06.2009


Ответы (3)


Вам нужно использовать pkg-config, чтобы получить пути включения:

$ pkg-config --cflags gtk+-2.0
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12

Вы также должны использовать его для получения библиотек:

$ pkg-config --libs gtk+-2.0
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lz -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0

(Вывод этих команд зависит от вашего дистрибутива и всегда будет правильным для вашего дистрибутива.)

person CesarB    schedule 24.06.2009
comment
Спасибо, это похоже на то, что мне нужно - я узнаю, что некоторые другие включения, которые создает ваш пример pkg-config (например, pango), также нуждаются в более конкретном каталоге включения. - person Ray2k; 25.06.2009

Вероятно, вы должны создать символическую ссылку, например:

ln -s /usr/local/include/gtk /usr/local/include/gtk-2.0

но вы можете сначала попробовать переустановить пакет GTK.

person bill    schedule 24.06.2009
comment
Я думал об этом, но это казалось неправильным, особенно учитывая все остальное, что нужно изменить таким же образом. - person Ray2k; 25.06.2009

Я давно не использовал gtk, но в Linux это обычно делается с помощью скрипта packagename-config (в данном случае, вероятно, gtk-config), который поставляется с заголовками разработки, которые ваш makefile предполагается вызывать, чтобы получить правильные пути включения и флаги компоновщика для пакета, используя --cflags и --libs соответственно.

Итак, попробуйте что-то вроде

GTK_INCLUDE=`gtk-config --cflags`

(обратите внимание на использование обратных кавычек, а не апострофов)

И вы, вероятно, также захотите добавить вывод gtk-config --libs в свои LDFLAGS, чтобы убедиться, что вы связываетесь со всеми правильными вещами.

person Tyler McHenry    schedule 24.06.2009
comment
AFAIR, gtk-config уже давно был заменен универсальным pkg-config (как и большинство других вариантов использования сценариев в стиле packagename-config). - person CesarB; 25.06.2009