使用 Libadwaita、GTK4 和 C 进行编译

使用 Libadwaita、GTK4 和 C 进行编译

在 Ubuntu 23.10 上安装 libadwaita-1-dev 包后,我尝试从官方文档

 gcc $(pkg-config --cflags --libs gtk4) $(pkg-config –-cflags --libs libadwaita-1) hello-adwita.c -o hello

不幸的是,它不起作用。错误消息是:

/usr/bin/ld: /tmp/cccNMYti.o: in function `glib_autoptr_clear_GtkApplication':
hello-adwita.c:(.text+0x1b): undefined reference to `g_object_unref'
/usr/bin/ld: /tmp/cccNMYti.o: in function `activate_cb':
hello-adwita.c:(.text+0x77): undefined reference to `gtk_application_window_new'
/usr/bin/ld: hello-adwita.c:(.text+0x8a): undefined reference to `gtk_label_new'
/usr/bin/ld: hello-adwita.c:(.text+0x93): undefined reference to `gtk_window_get_type'
/usr/bin/ld: hello-adwita.c:(.text+0xa5): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: hello-adwita.c:(.text+0xba): undefined reference to `gtk_window_set_title'
/usr/bin/ld: hello-adwita.c:(.text+0xbf): undefined reference to `gtk_window_get_type'

有人知道可能是什么原因吗?

答案1

这里的问题是gcc命令扩展所需库的顺序。具体来说,符号是从左到右解析的,因此,如果您的代码依赖于库,libawaita-1并且libawaita-1反过来又依赖于gtk-4库,则顺序应该是

hello-adwaita.c   <---  libadwaita-1   <--- libgtk-4

所以

gcc hello-adwaita.c -o hello $(pkg-config --cflags --libs libadwaita-1) $(pkg-config --cflags --libs gtk4)

但是在这种情况下,输出pkg-config --libs libadwaita-1包含 libgtk4 及其所有依赖库,因此您所需要的只是

gcc hello-adwaita.c -o hello $(pkg-config --cflags --libs libadwaita-1)

如需了解更多信息,请参阅

答案2

这不是一个有效的编译器命令行:您同时传递了编译器和链接器标志,而且传递的位置不对。首先传递编译器标志,然后是输出文件和输入文件;然后,您需要传递链接器标志:

gcc ${compiler_flags} -o ${output} ${input} ${linker_flags}

您还复制了 GTK 编译器和链接器标志:libadwaita 已经依赖于 GTK。

总结:

gcc $( pkg-config --cflags libadwaita-1 ) -o hello hello.c $( pkg-config --libs libadwaita-1)

相关内容