我曾尝试在 Visual Studio 上配置 gtk+,但无法正常工作。,谁能建议我一个合适的解决方案,如如何在 Visual Studio 2010 上安装 gtk
3 回答
我让 GTK+ 与 VS2010 一起工作,所以如果你也想让它工作,准备好享受一些乐趣,因为这需要几分钟。
首先,下载最新的Windows All-In-One bundle。我在这里使用的 GTK 2.24 包的可选直接下载链接。直接链接是 32 位版本。我没有测试 64 位版本,因为它仍然被列为实验性版本。
下载捆绑包后,将其解压缩到类似C:\gtk
或在我的情况下D:\gtk
接下来,我们将为 GTK 文件夹创建一个系统环境变量。打开命令提示符并写入:setx GTKDIR {Path to your GTK folder} /m
在我的情况下是setx GTKDIR D:\gtk /m
我们还将添加 GTK+ 构建的应用程序在 Windows 上运行所需的 .dll 文件到我们的系统 PATH 中。为了让事情变得非常简单,我建议您使用PathEditor编辑您的系统 PATH 。现在将 GDK 二进制文件夹的路径添加到系统 PATH 中,在我的例子中是 D:\gtk\bin。通过在命令提示符中键入PATH来确认 GTK bin 文件夹已添加到 PATH 。
现在我们继续使用 Visual Studio 2010 并创建一个新项目。
File
->New
->Project
Visual C++
->Win32
->Win32 Console Application
然后出现应用程序向导。
单击选择:
Windows Application
Empty Project
单击完成继续。
在我们添加任何源文件之前,右键单击解决方案资源管理器中的项目名称,然后单击属性。现在转到Configuration Properties,然后转到VC++ Directories。我们现在需要将 GTK 中的包含和库文件添加到Include Directories和Library Directories。
您的包含目录中应该有以下内容
$(GTKDIR)\lib\gtk-2.0\include
$(GTKDIR)\lib\glib-2.0\include
$(GTKDIR)\include
和图书馆目录:
$(GTKDIR)\lib
当我们仍在项目属性视图中时,单击链接器,然后单击系统。在右侧查找SubSystem并单击下拉框。选择Windows /SUBSYSTEM:WINDOWS
接下来,我们必须为编译器和链接器生成标志。幸运的是,GTK+ 附带了一个名为pkg-config的漂亮小工具,我们将使用它来自动为我们生成这些标志。pkg-config 工具可以在 GTK 的 bin 文件夹中找到。在我的情况下,这是D:\gtk\bin或%GTKDIR%\bin使用我们之前定义的系统变量。只需使用命令提示符导航到 bin 文件夹(创建的文本文件将在那里输出)并运行以下命令:
pkg-config --cflags gtk+-2.0 --msvc-syntax > compilerflags.txt
这将创建我们需要的编译器标志并将它们存储在一个文本文件中。我的编译器标志结果(我已删除标志-mms-bitfields,这是我们不需要的仅 gcc 标志):
-ID:/gtk/include/gtk-2.0 -ID:/gtk/lib/gtk-2.0/include -ID:/gtk/include/atk-1.0 -ID:/gtk/include/cairo -ID:/gtk/include/gdk-pixbuf-2.0 -ID:/gtk/include/pango-1.0 -ID:/gtk/include/glib-2.0 -ID:/gtk/lib/glib-2.0/include -ID:/gtk/include -ID:/gtk/include/freetype2 -ID:/gtk/include/libpng14
我们将对链接器标志做同样的事情:
pkg-config --libs gtk+-2.0 --msvc-syntax > linkerflags.txt
我的链接器标志结果:
/libpath:D:/gtk/lib gtk-win32-2.0.lib gdk-win32-2.0.lib atk-1.0.lib gio-2.0.lib pangowin32-1.0.lib gdi32.lib pangocairo-1.0.lib gdk_pixbuf-2.0.lib pango-1.0.lib cairo.lib gobject-2.0.lib gmodule-2.0.lib gthread-2.0.lib glib-2.0.lib intl.lib
生成所有需要的标志后,我们需要将它们添加到我们的项目中。再次,右键单击项目名称,然后单击Properties。现在转到C/C++
并单击Command Line
。在右侧,您应该会看到一个名为Additional Options的空框。将compilerflags.txt内容复制并粘贴到此框中。
完成上述操作后,单击Linker,然后单击Command Line。再次,只需将linkerflags.txt文件的内容复制并粘贴到Additional Options框中。当我们在这里时,添加最后一个链接器标志/ENTRY:mainCRTStartup这个标志告诉 Visual Studio 我们想要使用标准的 main() 而不是 Microsoft 的 _tmain() 作为我们的主程序入口点。
最后,在 Source Files 文件夹中,创建并添加一个新的 .cpp 文件,其中包含以下内容:
#include <gtk-2.0\gtk\gtk.h>
int main(int argc, char* argv[])
{
gtk_init(&argc, &argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize(window, 300, 200);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_title(GTK_WINDOW(window), "GTK+ with VS2010");
gtk_widget_show(window);
gtk_main();
return 0;
}
现在一切都应该准备好编译、链接和运行了。如果一切顺利,您应该会看到以下内容:
那很有趣,对吧?:)
如果您在像这样的指南的帮助下在 Windows 上构建 GTK+ 堆栈,那么您将无法享受使用预编译二进制文件的乐趣。
在这种情况下,我建议采用以下方法。
下载预编译的二进制文件 - 这有两个优点。
- 这附带了 pkg-config.exe 实用程序,您可以将其用于已编译的源代码。
- 这还包含 pkgconfig 文件夹,其中包含大量 .pc 文件,这些文件可以适应已编译的源代码。
以调试/发布模式编译软件包——这是自己编译的主要优点——并系统地分别在 include、lib 和 bin 文件夹中安排头文件、libs 和 dlls/exe。
将 pkgconfig 文件夹从 precompiled_gtk_source\bin 复制到 compiler_gtk_source\bin 并设置 PKG_CONFIG_PATH 变量的路径以将 compiler_gtk_source\bin\pkgconfig 添加到其中。
现在,考虑到自己编译 gtk 时生成的库名称和预编译包中对应的库名称可能不同,您可能需要在 compiler_gtk_source\bin\pkgconfig*.pc 文件中进行必要的更改。我会在这里采用自上而下的方法(我们很快就会看到优势)。从上到下,我的意思是最终产品将是首先要编辑的产品。
例如,在这种情况下,gtk+ 是最终产品,我将首先配置这个包的 .pc。程序如下:
- 首先看创建的dll的名称。就我而言,它是 gtk-3.0。如果预编译二进制文件附带的 .pc 文件有另一个名称,则适当更改名称 - 在我的例子中是 gtk-3.0.pc。(这应该是所有其他 .pc 文件的情况。)
- 在文本编辑器中打开 gtk-3.0.pc,您将看到如下内容。
gtk-3.0.pc 文件:
prefix=c:/gtk_compilation/vs12/win32
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
targets=win32
Name: GTK+
Description: GTK+ Graphical UI Library
Version: 3.18.2
Requires: gdk-3.0 atk-1.0 cairo cairo-gobject gdk_pixbuf-2.0 gio-2.0
Requires.private: atk
Libs: -L${libdir} -lgtk-3
Cflags: -I${includedir}/gtk-3.0 -mms-bitfields
上面的一个是我的自定义文件。如果您不知道每一行的作用,您可以查看pkg-config help。然而,Require 选项需要特别提及。这是您放置依赖 dll 的地方 - 再次确保 dll 的名称与您在 bin 文件夹中的名称完全匹配。
我们需要递归地更改Require语句之后包含的 dll 的 .pc 文件,如果缺少任何 .pcs 或名称不匹配,您可以进行适当的更改。到目前为止,您应该已经了解了自上而下方法的优势。它可以帮助我们系统地整理依赖 .pc 文件,直到我们将它们全部整理出来。现在,运行以下命令以查看是否正常。
最后运行 pkg-config 命令,如下所示:
pkg-config --cflags gtk-3.0 --msvc-syntax > compilerflags.txt
pkg-config --libs gtk+-2.0 --msvc-syntax > linkerflags.txt
我只是将结果重定向到一个名为 compilerflags.txt & linkerflags.txt 的文本文件,以便您可以随时通过剪切、复制和粘贴来使用它们。当然,您应该只保留编译器特定的标志。
希望这对某人有所帮助。