c - 从哪里获得/usr/include中所有的C头文件?

标签 c header-files gtk3 clion

您应该知道两件事


使用Kali Linux
我是菜鸟


好了,解决这个问题。我当时使用Clion编码我的C项目,一切都很好,但是突然间我想用C制作GUI应用程序,所以我用Google搜索,发现GTK是最好的选择。去他们的网站下载所有必需的文件,他们也安装了依赖文件,一切顺利。奇怪的是,gtk头文件没有直接包含在/ usr / include中,而是有一个文件“ gtk-3.o”,其中包含gtk和gdk头文件。所以诅咒我的笨蛋,我一直试图包括'gtk-3.o'而不是像这样#include <gtk-3.0/gtk/gtk.h>这样做,每当这样做时,我都会出错。然后,我做了一个人们可能想到的最愚蠢的事情,我将gtk-3.0文件夹中的所有文件复制并直接粘贴到/ usr / include中。现在,当我包括所需的文件(例如包括gtk.h)以及之后的文件(包括gdk.h)和之后的另一个文件(忘记了名称)之后,我得到一个错误,提示仅可以直接包括gtk.h。我在这个错误中进行了搜索,发现一个家伙说GTK家伙不希望将gtk文件直接包含在/ usr / include中,因为它们的某些头文件存在未满足的依赖性。一个人在下面评论说,他像通过子目录一样包含了gtk文件,并且工作正常,但是现在我无法做到这一点,因为我已经将gtk-3.0的内容复制到了/ usr / include中。我已经完全删除了Clion,并正在考虑删除/ usr / include的内容,也许重新安装Clion会使头文件恢复。如果这不会发生,请指导我如何获取头文件,或者如果有的话,可以找到此解决方案的更好替代方案。非常感谢您的帮助,因为我一整天都在努力解决此问题,我精疲力尽,需要专家的帮助。谢谢

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

最佳答案

除非您完全确定自己在做什么,否则永远不要手动弄乱/usr中的文件。

一旦弄乱了/usr(取决于它的严重程度),您也许可以通过重新安装受影响的程序包来对其进行修复,但最终也可能会完全重新安装操作系统。

操作系统正常运行后,就应该开始。
不幸的是,我从未使用过Kali Linux,但是我将尝试以适用于大多数发行版的方式来表达答案。

通用解决方案

安装编译器

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

大多数发行版都具有可安装的基本构建元软件包。

我也强烈建议安装pkg-config

安装开发库

从发行版的程序包管理器中安装要使用的库及其开发程序包。在基于Debian的系统上,开发包以-dev后缀,在基于Fedora的系统上它们以-devel后缀。因此,如果要使用mylibrary,则需要:

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


笔记:


除非您完全确定自己在做什么,否则请始终通过发行版的软件包管理器安装软件,而不是通过第三方来安装软件,尤其是永远不要从互联网上的随机位置安装软件。
一些发行版使用其他程序包管理器,例如。 pacmanzypperpkcon等。You 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,介子等构建工具。它将为您生成这些命令。

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

创建一个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

关于c - 从哪里获得/usr/include中所有的C头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811712/

相关文章:

c - 使用 Frama-c 分析带有 CMake 构建基础设施的项目

C++ 错误 : "undeclared identifier" when trying to make object. header 问题?

c++ - 为什么#include 只完成声明和定义?

Python GTK3 : how to create a Gtk. 文件选择对话框?

c - 通过用户输入更新 GTK+3 中的面板

c - c中的Igraph随机数生成器

c - 不带表达式返回

c - 用 C 为所有可能的排列设计一个算法,包括零

c++ - c++中goblin库头文件报错

css - 有没有一种简单的方法来获取 GtkWidgetPath 的文本表示?