GTK代码将不会链接(win7-64bit,C,msys64)

时间:2018-08-02 11:49:57

标签: c windows gtk

我正在用C开发,并且决定使用GTK进行GUI应用程序开发后,在Windows 7(64位)下使用Gsys的msys64版本连接最新的GTK3库来构建我的应用程序时遇到了问题。我对SO进行了应有的研究,并进行了大量阅读和测试,但没有任何解决方案。

WIKI的代码示例,我正在尝试构建(“ gtk_ex.c”):

#include <gtk/gtk.h>

 void on_button_clicked (GtkButton *button, gpointer data)
{
  g_print ("Knopf '%s' geklickt!\n", gtk_button_get_label (button));
  gtk_main_quit (); /* Quits */
}

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

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Hallo Welt!");
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  button = gtk_button_new_with_label ("Hello GTK!");
  gtk_container_add (GTK_CONTAINER (window), button);

  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), NULL);

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;
}

我已经做过的事情(现状):

  • 为win7(64位)操作系统安装了msys64
  • 通过pacman获得相关软件包

    pacman -S mingw-w64-x86_64-gtk3

    pacman -S mingw-w64-x86_64-toolchain base-devel

将系统PATH的环境变量设置为C:\msys64/mingw64/bin

我通过依次添加编译器抱怨缺少的依赖项来构建批处理文件:

set GINC_PATH="C:\msys64/mingw64/include"
set GLIB_PATH="C:\msys64/mingw64/lib"
gcc -v -g %1.c -o %1 -I %GINC_PATH%/gtk-3.0 -I %GINC_PATH%/glib-2.0 -I %GLIB_PATH%/glib-2.0/include -I %GINC_PATH%/pango-1.0 -I %GINC_PATH%/cairo -I %GINC_PATH%/gdk-pixbuf-2.0 -I %GINC_PATH%/atk-1.0

(在此批处理文件中,我只声明了include选项,因为-L和-l命令在任何地方都无法使用...)使用此批处理文件,构建过程现在到达了构建的链接部分过程,其中完全失败并显示以下输出(摘录,许多相似的行):

C:\C/gtk_ex.c:8: undefined reference to `gtk_application_window_new'
C:\C/gtk_ex.c:9: undefined reference to `gtk_window_get_type'
C:\C/gtk_ex.c:9: undefined reference to `g_type_check_instance_cast'
(...)
collect2.exe: error: ld returned 1 exit status

我在SO上了解到,GCC可能对命令行中包含和库选项的确切顺序有些挑剔-但是,即使尝试了GCC输入的命令行版本的多个版本(无论是手动还是按由pkg-config自动生成所有可能的变化... 因此,基本上,我需要在哪里将-L和-l命令用于库绑定才能成功完成构建过程?

EDIT_1:

我仔细检查了所有包含路径是否正确,还运行了pkg-config --cflags gtk+-3.0pkg-config --libs gtk+-3.0来自动生成输出-上面显示的我的批处理文件仍然返回输出“对XY的未定义引用”(几行)再加上最后一行

collect2.exe: error: ld returned 1 exit status

按ryyker的建议在批处理文件中链接单独的一行:

gcc -o gtk_ex gtk_ex.o -L "C:\msys64/mingw64/lib" -lgtk -lgdk

返回:

gcc: error: gtk_ex.o: No such file or directory

(因此* .o文件不存在,这意味着编译失败吗?)

EDIT_1 END

作为最后的手段,我想在这里问是否可能错过了一些尝试的方法。我很高兴能提示我如何解决此问题。否则,我将不得不恢复到2013年起使用的旧版GTK捆绑版本。但是,我更喜欢使用当前维护的版本...

EDIT_2:

谢谢@ryyker和@Gerhardh,您救了我:)-我听取了您的建议,将编译拆分并链接到两行。然后,我通过-l相继添加了库,并检查了添加是否有效。然后,这个修改后的批处理文件就达到了目的:

set GINC_PATH="C:\msys64/mingw64/include"

set GLIB_PATH="C:\msys64/mingw64/lib"

gcc -c %1.c -o %1.o -I %GINC_PATH%/gtk-3.0 -I %GINC_PATH%/glib-2.0 -I %GLIB_PATH%/glib-2.0/include -I %GINC_PATH%/pango-1.0 -I %GINC_PATH%/cairo -I %GINC_PATH%/gdk-pixbuf-2.0 -I %GINC_PATH%/atk-1.0

gcc -o %1 %1.o -L %GLIB_PATH% -lgtk-3 -lgdk-3 -lgobject-2.0 -lglib-2.0

%1.exe

我可以将其标记为已回答/已解决,并为您的输入功劳吗?谢谢大家!

亲切的问候

Xuttuh

1 个答案:

答案 0 :(得分:0)

请节省一些时间,并使用真实的构建系统,例如Meson。它是跨平台的,仅依赖于Python 3和忍者(忍者是make的替代品)。

Building a GTK+ app is 3 lines of Meson.