从哪里获取位于/ usr / include中的所有C头文件?

时间:2017-08-22 07:43:29

标签: c header-files gtk3 clion

你应该知道两件事

  1. 使用Kali Linux
  2. 我是菜鸟
  3. 好的解决问题。我正在使用Clion来编写我的C项目,一切都很公平但突然我想用C制作GUI应用程序所以我谷歌并发现GTK是最好的选择。去他们的网站下载了所有安装的所需文件,他们还安装了依赖文件,一切顺利。奇怪的是,gtk头文件没有直接包含在/ usr / include中,而是有一个文件&#34; gtk-3.o&#34;其中包含gtk和gdk头文件。所以诅咒我的noobness我总是试图包括&gt; -k-3.o&#39;而不是这样做#include <gtk-3.0/gtk/gtk.h>,每当我这样做,我得到错误。然后我做了一个人们想到的最愚蠢的事情,我复制了gtk-3.0文件夹中的所有文件并将它们直接粘贴到/ usr / include中。现在,当我包括所需的文件,如包括gtk.h和之后包括gdk.h和之后的另一个文件(忘记名称)我得到一个错误,说只有gtk.h可以直接包含。我搜索了这个错误并发现一个人说GTK的人不希望gtk文件直接包含在/ usr / include中,因为他们的某些头文件存在未满足的依赖关系。一个人在下面评论说,他包括gtk文件,如通过子目录和工作正常,但现在我不能这样做,因为我已经复制了/ usr / include中的gtk-3.0的内容。我已经完全删除了Clion并且正在考虑删除/ usr / include的内容,并且可能重新安装Clion将获得头文件。如果不会发生这种情况,请指导我如何获取头文件或更好的替代方案,如果有的话。帮助将受到高度赞赏,因为我花了一整天时间试图解决这个问题,我很累,想要一些专家的帮助。感谢

    注意:我尚未删除/ usr / include /

1 个答案:

答案 0 :(得分:1)

你应该从不手动弄乱/usr中的文件,除非你绝对确定你在做什么。

一旦你搞砸了你的/usr,取决于它有多糟糕,你可以通过重新安装受影响的软件包来修复它,但你也可能最终完全重新安装操作系统。

一旦你有了一个有效的操作系统,这就是你应该如何开始的 不幸的是,我从未使用过Kali Linux,但我会尝试以适用于大多数发行版的方式来解释答案。

一般解决方案

安装编译器

您将需要一个编译器。如果你想使用C,我建议 gcc clang 。您还需要 make 以及其他构建工具,如cmake,qmake,meson等。

大多数发行版都有一个 build-essential 元数据包,您可以安装。

我还强烈建议安装pkg-config

安装用于开发的库

从发行版的程序包管理器中安装要使用的库及其开发包。在基于Debian的系统上,开发包后缀为-dev,在基于Fedora的系统上,后缀为-devel。所以如果你想使用mylibrary,你需要:< / p>

# On Debian-based systems
apt-get install mylibrary mylibrary-dev
# On Fedora-based systems
dnf install mylibrary mylibrary-devel

注意:

  • 除非您绝对确定您正在做什么,始终通过您的发行版的软件包管理器安装软件,从不来自第三方,来自互联网随机地点的尤其不会
  • 某些发行版使用其他包管理器,例如。 pacmanzypperpkconYou can check this wikipage to see how they correlate.
  • 如果您不确定软件包的名称是什么,可以使用软件包管理器的搜索功能,也可以在您的软件包的数据库网站上进行搜索。

使用库

您编写了一些代码,包含库的标题并调用一些函数。然后,当您尝试编译代码时,编译器会告诉您它无法找到这些包含,并且无法找到您要使用的函数的定义。

告诉编译器您要使用该库。

您可以通过使用-I设置包含路径并使用-l将库添加到链接器来执行此操作。如果您不确定应该将哪些内容传递给编译器,pkg-config可以解决问题:

以下命令将告诉您需要告诉编译器:

pkg-config --cflags mylibrary
pkg-config --libs mylibrary

所以编译命令如下所示:

gcc -I/usr/include/mylibrary -lmylibrary yourcode.c

注意:

  • pkg-config而言,该库的名称并不总是与您使用apt-getdnf安装的软件包的名称相匹配。您可以通过查看/usr/lib/pkgconfig或类似位置找到该名称。 (在基于Fedora的64位系统上,/usr/lib64/pkgconfig,在其他发行版上,它可能在其他地方。)

使用构建工具

虽然理解上述过程是非常值得的,但是手动编写所有这些命令很快就会变得非常繁琐(特别是对于大型项目),所以你可以使用像cmake,qmake,meson这样的构建工具。等等,它将为您生成这些命令。

这些工具已经超出了这个已久的答案的范围,但随时可以在网上搜索它们,你一定会找到一个教程。

创建GTK应用

在上述解释之后,让我们看看所有这些在实践中是如何运作的。我将向您展示如何编译一个非常简单的GTK应用程序。

我使用Fedora,但其他任何GNU / Linux发行版的步骤都相似。

首先,安装GTK及其开发包

# Fedora
dnf install gtk3-devel
# Debian
apt-get install libgtk-3-dev

我使用Google搜索某些GTK示例代码并找到了their getting started page。因此,请使用以下示例代码并将其保存在example.c

#include <gtk/gtk.h>

static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget *window;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  gtk_widget_show_all (window);
}

int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

然后找出pkgconfig名称:

# Note: the location might be different on your system, see above
ls /usr/lib64/pkgconfig | grep gtk

因此pkgconfig名称为gtk+-3.0 现在找出正确的编译器标志:

pkg-config --libs --cflags gtk+-3.0

其中输出以下内容:

-I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libdrm -I/usr/include/harfbuzz -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include -pthread -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

您的计算机上的结果会有所不同。使用您在计算机上获得的此命令的结果!所以不要复制粘贴此命令,因为它不适合您。使用pkgconfig命令的结果编译示例代码:

gcc example.c -o example -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libdrm -I/usr/include/harfbuzz -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include -pthread -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

或者简单地说:

gcc example.c -o example `pkg-config --cflags --libs gtk+-3.0`

正确编译程序。

让我们运行它:

./example

Aaaand万岁!它显示一个空的GTK窗口,正如我们所期望的那样 如果您想了解更多信息,请参阅Getting Started with GTK+Compiling GTK+ Applications