我正在尝试编译一个简单的 GTK 应用程序以在 Trisquel 7 机器上进行测试。这些软件包源自 Ubuntu 14.04 LTS。我已经libgtk2.0-dev
安装了,但是当我尝试编译时,结果就是这样。
$ gcc -Wall -Wextra -std=c11 `pkg-config --libs --cflags gtk+-2.0` main.c
a_out-main.o: In function `main':
/home/mac/c/main.c:7: undefined reference to `gtk_init'
/home/mac/c/main.c:9: undefined reference to `gtk_window_new'
/home/mac/c/main.c:10: undefined reference to `gtk_window_get_type'
/home/mac/c/main.c:10: undefined reference to `g_type_check_instance_cast'
/home/mac/c/main.c:10: undefined reference to `gtk_window_set_title'
/home/mac/c/main.c:11: undefined reference to `g_type_check_instance_cast'
/home/mac/c/main.c:11: undefined reference to `gtk_window_set_default_size'
/home/mac/c/main.c:12: undefined reference to `g_type_check_instance_cast'
/home/mac/c/main.c:12: undefined reference to `gtk_window_set_position'
/home/mac/c/main.c:13: undefined reference to `gtk_widget_show'
/home/mac/c/main.c:15: undefined reference to `g_type_check_instance_cast'
/home/mac/c/main.c:15: undefined reference to `gtk_main_quit'
/home/mac/c/main.c:15: undefined reference to `g_signal_connect_data'
/home/mac/c/main.c:18: undefined reference to `gtk_main'
我已经检查了的输出pkg-config --libs --cflags gtk+-2.0
,它看起来是正确的,但由于某种原因,它没有被正确链接。
答案1
将包含 pkg-config 命令的反引号放在行末。出于某种原因,gcc 只有在最后才正确读取它。我今天尝试从 GTK repo 构建示例时遇到了完全相同的问题。他们的 makefile 中的行,
$(CC) -o $(@F) $(LIBS) $(OBJS)
必定是
$(CC) -o $(@F) $(OBJS) $(LIBS)
反而。
答案2
我认为问题在于链接器是单程的。即,它必须先看到引用,然后才能找到其定义。因此,指出定义的 pkg-config 位必须位于引用所在的 main.c 之后。