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

Я пытаюсь построить привет мир, используя 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 использоваться для определения местоположения заголовочных файлов и добавления соответствующих каталогов включения? Я почти ничего не знаю о настройке, но, похоже, я узнаю кое-что о системе во время сборки, и это то, что мне нужно.

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

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

Ответы [ 3 ]

8 голосов
/ 25 июня 2009

Вам нужно использовать 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

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

4 голосов
/ 25 июня 2009

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

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

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

2 голосов
/ 25 июня 2009

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

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

GTK_INCLUDE=`gtk-config --cflags`

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

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

...