我正在用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;
}
我已经做过的事情(现状):
通过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.0
和pkg-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