8

我已经搜索和搜索,但我没有得到我真正想要的信息。有人可以尽可能完整和基本地解释在 Linux 上使用 GCC 用 C 编写时如何编译 Gtk+ 代码。有一些我完全不理解的东西,比如反引号、“c99”和 .o 文件。

我也很感激学习 Gtk+ 代码的任何资源。我找到的所有资源都是针对 2.x 版本的,但我认为 3.6 是当前版本。

我想重申一下,我只对 C 代码感兴趣。请不要尝试向我解释 C++ 或 C# 的好处,我已经阅读了所有这些。我是来找C的。谢谢!

4

5 回答 5

18

对于初学者,您编写 C 代码,例如“hello_world_gtk.c”,然后使用适当的编译器和链接器标志编译并将其链接到 Gtk。这些标志由 pkg-config 工具提供给您。要获得所需的编译器标志,您可以使用以下命令调用该工具:

pkg-config gtk+-2.0 --cflags

对于链接标志:

pkg-config gtk+-2.0 --libs

反引号允许您从 pkg-config 获取输出并将其作为参数传递给 gcc:

gcc `pkg-config gtk+-2.0 --cflags` hello_world_gtk.c -o hello_world_gtk `pkg-config gtk+-2.0 --libs`

但是您不需要使用反引号。如果需要,您可以手动复制和粘贴标志。

对于 Gtk 3,将“2.0”替换为“3.0”。如果 pkg-config 报告它找不到包,那么您没有安装 Linux 发行版提供的 Gtk 开发包。

如果您通常不了解如何将某些内容编译成目标文件然后链接它,那么您不应该从 Gtk 开始,而是使用纯 C。一旦您熟悉了编译和链接的绝对基础知识,您就可以继续学习 Gtk 应用程序。

于 2013-02-18T20:55:01.770 回答
2

正如其他人所说,您的问题过于广泛。它询问反引号(基本的 shell 语法)、什么是“.o”文件(基本编程)和 GTK 编程(有点高级的编程)。

但是为了最好的回答,假设你只有一个源文件,使用

gcc -Wall -Wextra -std=c99 `pkg-config --cflags --libs gtk+-2.0` example.c -o example

其中“example.c”是您的源的名称。这是细分:

  • 使用标志“-Wall”和“-Wextra”,这样您就可以看到所有警告(并修复它们)。

  • 使用“std”标志来设置你的 C 方言。有几个,gcc 对其中的大多数有全部或部分支持。阅读手册页或信息页以获取更多信息。像上面那样使用“c99”并不是一个糟糕的选择。

  • 并使用 pkg-config 和命令替换(即反引号)来设置库和包含。请注意,您可以同时执行这两项操作,尽管很多人通过 pkg-config 的两个反引号版本使用它两次。反引号替换引号内命令的输出。尝试在命令行上单独在反引号内运行 pkg-config,您将看到它的作用。

不幸的是,3.x GTK 代码的资源并不多,而且大部分仍然是基于 2.x 的。您只需要求助于 gtk 邮件列表或参考手册。

至于 GTK 3.x,您无法编译的原因可能是您的发行版是基于 GTK 2.x 的。较新的发行版可能在其存储库中包含 GTK 3.x。

于 2013-03-15T21:39:56.437 回答
2

以 gtk2.0 为例:

$gcc test.c -o gnometest $(pkg-config --cflags --libs gtk+-2.0)

以 gtk3.0 为例:

$gcc $(pkg-config --cflags gtk+-3.) test.c -o gnometest $(pkg-config --libs gtk+-3.0) 
于 2019-02-21T17:33:34.277 回答
2

从 Gtk Docs入门页面:

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

另请查看Nikos C. 的 Aswer以了解有关pkg-config.

于 2016-12-23T19:44:56.813 回答
0

我的Makefile

LDLIBS = -lcurl -lpthread `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
于 2014-06-25T11:14:00.460 回答