在Windows 7上编译和运行GTK+应用程序

3

系统:Windows7,32位,GTK 2.24.10,MinGW。
我正在尝试编写基于GTK的基本helloworld.c类型应用程序。但是它无法运行。
以下是我遵循的步骤:

  1. 安装MinGW。
  2. 下载GTK+的全套捆绑包。
  3. 将内容提取到C:\gtk文件夹中。
  4. 打开cmd并转到C:\gtk\bin目录,然后运行pkg-config --cflags --libs gtk+-win32-2.0命令。
  5. 它会打印编译标志列表和链接项目的库。 复制它们并创建一个批处理文件如下所示。 set VAR=FLAGS start cmd 其中VAR = GTK,FLAGS =前一个命令(pkg-config)的输出。 当您想要编译文件时,请使用命令:gcc foo.c %VAR%

D:\gtk>gcc -o project helloworld.c %GTK%
gcc: %GTK%: 没有那个文件或目录 helloworld.c:1:21: 错误:gtk/gtk.h:没有那个文件或目录 helloworld.c: 在函数‘main’中: helloworld.c:5: 错误:未声明的标识符‘GtkWidget’(在此函数内第一次使用) helloworld.c:5: 错误:(每个未声明的标识符仅报告一次 helloworld.c:5: 错误:在此函数中,它出现了多次。) helloworld.c:5: 错误:未声明的标识符‘window’(在此函数内第一次使用) helloworld.c:9: 错误:未声明的标识符‘GTK_WINDOW_TOPLEVEL’(在此函数内第一次使用)

D:\gtk>gcc -Wall -g helloworld.c -o helloworld pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0
gcc: pkg-config: No such file or directory
gcc: gtk+-2.0: No such file or directory
gcc: pkg-config: No such file or directory
gcc: gtk+-2.0: No such file or directory
cc1.exe: error: unrecognized command line option "-fcflags"
cc1.exe: error: unrecognized command line option "-flibs"

D:\gtk中的批处理文件

set GTK=-mms-bitfields -IC:/gtk/include/gtk-2.0 -IC:/gtk/lib/gtk-2.0/include -IC:/gtk/include/atk-1.0 -IC:/gtk/include/cairo -IC:/gtk/include/gdk-pixbuf-2.0 -IC:/gtk/include/pango-1.0 -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include -IC:/gtk/include -IC:/gtk/include/freetype2 -IC:/gtk/include/libpng14  -LC:/gtk/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl
start cmd

helloworld.c

#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_show  (window);

    gtk_main ();

    return 0;
}

参考资料: 在 Windows 下安装 GTK 并使用 GCC 进行编译?

3个回答

6
您可以尝试以下手动步骤开始:
1) 在命令提示符下运行pkg-config命令以获取您的包含标志:
c:\dev\gtk224\bin\pkg-config.exe --cflags gtk+-2.0
这是我的输出结果:
-mms-bitfields -Ic:/dev/gtk224/include/gtk-2.0 -Ic:/dev/gtk224/lib/gtk-2.0/include -Ic:/dev/gtk224/include/atk-1.0 -Ic:/dev/gtk224/include/cairo -Ic:/dev/gtk224/include/gdk-pixbuf-2.0 -Ic:/dev/gtk224/include/pango-1.0 -Ic:/dev/gtk224/include/glib-2.0 -Ic:/dev/gtk224/lib/glib-2.0/include -Ic:/dev/gtk224/include -Ic:/dev/gtk224/include/freetype2 -Ic:/dev/gtk224/include/libpng14

2) 将(1)的输出设置为变量GTK_INCLUDES:

C:\dev\1_repo\gtk_scratch>set GTK_INCLUDES=-mms-bitfields -Ic:/dev/gtk224/include/gtk-2.0 -Ic:/dev/gtk224/lib/gtk-2.0/include -Ic:/dev/gtk224/include/atk-1.0 -Ic:/dev/gtk224/include/cairo -Ic:/dev/gtk224/include/gdk-pixbuf-2.0 -Ic:/dev/gtk224/include/pango-1.0 -Ic:/dev/gtk224/include/glib-2.0 -Ic:/dev/gtk224/lib/glib-2.0/include -Ic:/dev/gtk224/include -Ic:/dev/gtk224/include/freetype2 -Ic:/dev/gtk224/include/libpng14

(确保您使用第1步的输出)

3) 对于库标志,执行与步骤1相同的操作:

c:\dev\gtk224\bin\pkg-config.exe --libs gtk+-2.0

这是我的输出结果:

-Lc:/dev/gtk224/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl

4) 将(3)中的输出设置为变量GTK_LIBS

C:\dev\1_repo\gtk_scratch>set GTK_LIBS=-Lc:/dev/gtk224/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl

确保您使用第3步的输出结果。
5) 确保您的路径中包含gtk+和MinGW:
set PATH=c:\dev\MinGW\bin\;c:\dev\gtk224\bin

请确保您将路径设置为您自己的mingw和gtk目录。

6) 编译:

c:\dev\MinGW\bin\gcc.exe -g helloworld.c -o helloworld %GTK_INCLUDES% %GTK_LIBS%

7) 当您能够成功编译时,将步骤2、4、5和6中所做的复制到批处理文件中,这样只需运行批处理文件即可编译您的应用程序。


虽然它解决了我的问题,但我很好奇这个设置GTK_INCLUDES和GTK_LIBS保存在哪里。我尝试查看环境设置并使用PowerShell get-childitem env:,但找不到这些变量。 - msinfo
“SET” 命令仅在当前会话中保存值(即您运行“SET”的命令窗口)。其他命令窗口将无法看到设置的值(除非其他命令窗口是子级)。您是否从与运行“SET”的命令窗口相同的命令窗口(或子级)中运行了 PS 命令? - Chris Snow
哎呀!是的,我使用了两个不同窗口(不同实例)中的命令提示符和PowerShell提示符。谢谢你的解释。 - msinfo

3
错误就在这里。 pkg-config是一个实用程序,它有助于(并且我强烈建议)确定链接和库标志。你遇到的问题是如果你像传递参数一样传递它们,gcc会将其解释为参数 - 你需要在子shell中执行它们(但我不知道如何在Windows shell或cygwin下执行)。在bash中,它可以是$(pkconfig --libs gtk-2.0)或者使用反引号而不是$(...)
D:\gtk>gcc -Wall -g helloworld.c -o helloworld pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0
gcc: pkg-config: No such file or directory
gcc: gtk+-2.0: No such file or directory
gcc: pkg-config: No such file or directory
gcc: gtk+-2.0: No such file or directory
cc1.exe: error: unrecognized command line option "-fcflags"
cc1.exe: error: unrecognized command line option "-flibs"

1
谢谢,我找到了类似的东西:https://dev59.com/BHbZa4cB1Zd3GeqPKdZW?lq=1。第九步提到使用bash.exe,但我的bin文件夹中没有它,不过它创建了一个批处理命令,不知道如何在cmd提示符下执行相同的命令。 - msinfo
1
我强烈推荐像这样的情况使用Cygwin。使用Cygwin bash shell和MinGW。别再自找麻烦,用简单的方式完成吧! - SevenBits
drahnr:你的观点是正确的,反引号是问题的原因之一。 - msinfo

2

当运行“hello, world”程序时,出现了相同的错误。以下解决方案适用于我。

不要将你的helloworld.c文件保存在任意位置,而是放在

MinGW > msys > 1.0 > home > "你的主文件夹名称" > helloworld.c

现在,打开msys.bat并编写运行程序的命令。在我的情况下,它是:

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

而且它对于我来说确实有效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接