【问题标题】:Header files in subdirectories (e.g. gtk/gtk.h vs gtk-2.0/gtk/gtk.h)子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)
【发布时间】:2010-11-05 16:16:49
【问题描述】:

我正在尝试使用 GTK 构建一个 hello world,其中包括以下行:

#include <gtk/gtk.h>

如你所料。

提供的 Makefile 有一行:

GTK_INCLUDE = -I/usr/local/include

所以它会期望在 /usr/local/include/gtk/gtk.h 中找到 gtk.h。但是在我的系统上,它位于 /usr/local/include/gtk-2.0/gtk/gtk.h,即在一个版本化的子目录中。

显然,在这种情况下,我可以将 -I/usr/local/include/gtk-2.0 添加到 Makefile,但同样的问题会出现在 gtk.h 的依赖项等中。

有什么好的方法来解决这个问题吗?可以使用 configure 来定位头文件的位置并添加适当的包含目录吗?我对配置几乎一无所知,但它似乎在构建时发现了有关系统的信息,这就是我所追求的。

这是一种常见的情况,还是我有一些奇怪的目录结构才是真正的问题?

感谢您的指点!

【问题讨论】:

标签: c linux build include header


【解决方案1】:

您需要使用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

(这些命令的输出将根据您的发行版而有所不同,并且始终是适合您发行版的正确输出。)

【讨论】:

  • 谢谢,这看起来像我所追求的 - 我认识到您的 pkg-config 示例创建的其他一些包含(如 pango)也需要更具体的包含目录。
【解决方案2】:

您可能必须创建一个符号链接,例如:

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

但您可以先尝试重新安装 GTK 包。

【讨论】:

  • 我曾想过这样做,但这似乎不是正确的做法,尤其是考虑到需要以相同方式更改的所有其他内容。
【解决方案3】:

我已经很久没有使用 gtk 了,但是在 Linux 中通常处理的方式是有一个名为 packagename-config 的脚本(在这种情况下,可能是 gtk-config),它带有开发头文件,您的 makefile 应该调用它,以便分别使用 --cflags 和 --libs 获取包的正确包含路径和链接器标志。

所以试试类似的东西

GTK_INCLUDE=`gtk-config --cflags`

(注意使用反引号,而不是撇号)

您可能还想将gtk-config --libs 的输出添加到您的 LDFLAGS 中,以确保您链接到所有正确的内容。

【讨论】:

  • AFAIR,gtk-config 很久以前就被通用的 pkg-config 取代了(就像 packagename-config 样式脚本的大多数其他用途一样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多