您应该知道两件事
使用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
笔记:
除非您完全确定自己在做什么,否则请始终通过发行版的软件包管理器安装软件,而不是通过第三方来安装软件,尤其是永远不要从互联网上的随机位置安装软件。
一些发行版使用其他程序包管理器,例如。
pacman
,zypper
,pkcon
等。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-get
或dnf
安装的软件包的名称匹配。您可以通过查看/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/