在 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)