【问题标题】:GTK+ compilation undefined reference CGTK+ 编译未定义参考 C
【发布时间】:2023-03-13 05:15:02
【问题描述】:

我正在尝试编译和链接一个从网上下载的简单程序,以了解如何使用 gtk+ 库制作 GUI。

这是我的生成文件:

CC = gcc
BIN = gtk_led
SRC = main.c gtkled.c
OBJ = main.o gtkled.o

CPPFLAGS =-Wall -W -ansi -pedantic -O2 `pkg-config --cflags gtk+-2.0`

LDFLAGS = `pkg-config --libs gtk+-2.0`

all: $(BIN)

$(BIN): $(SRC)
$(CC) $(CPPFLAGS) -c $(SRC)
$(CC) $(LDFLAGS) -o $(BIN) $(OBJ)

clean:
rm -f *.o *~ core $(BIN)

当我执行make 时,构建失败并出现以下错误:

gtkled.o: In function `gtk_led_size_allocate':
gtkled.c:(.text+0x43a): undefined reference to `g_return_if_fail_warning'
gtkled.c:(.text+0x487): undefined reference to `gdk_window_move_resize'
gtkled.o: In function `gtk_led_size_request':
gtkled.c:(.text+0x4f5): undefined reference to `g_return_if_fail_warning'

所以我不明白为什么....我是 Linux 新手,所以这对我来说很难 :) (在 ubuntu 上,使用 virtualBox)

谢谢。

【问题讨论】:

  • 最好显示make正在为你运行的命令...
  • 不要在编译器标志中使用 -ansi -pedantic。它们充其量是完全无用的,或者最坏的情况是误导和错误的。如果您想要来自 GCC 的一组体面的现代编译器警告,请使用 -Wall -Wextra。或者,查看 gcc 手册页并选择对您的代码库有意义的警告。

标签: c linux ubuntu linker gtk


【解决方案1】:

不要在Makefile-s 中使用反引号(但使用GNU make 的shell function)。而且GTK2已经过时了,为什么不用GTK3呢?

将至少两行 CPPFLAGSLDFLAGS 替换为

 PACKAGES= gtk+-3.0
 OPTIMFLAGS=-g # put -O2 when all is ok
 PKG_CFLAGS= $(shell pkg-config  --cflags $(PACKAGES))
 CPPFLAGS =-Wall -W -ansi -pedantic $(OPTIMFLAGS) $(PKG_CFLAGS)
 LDFLAGS = $(shell pkg-config --libs $(PACKAGES))

顺便说一句,您的意思可能是 CFLAGS 而不是 CPPFLAGS。运行make -p 了解make 已知的内置规则是什么;有关一些相关问题,另请参阅 this answerthat answer...

另外,gcc 的参数顺序也很重要,所以

 $(CC) $(LDFLAGS) -o $(BIN) $(OBJ)

错了,你可能想要

 $(CC) $(OBJ) $(LDFLAGS) -o $(BIN) 

【讨论】:

  • 感谢您的回答,但这不起作用...:/我不确定我是否需要一个复杂的 makefile。我在源代码中找到了它。但我只有 main.c 文件和许多库。没有一个简单的方法可以用这样的东西编译它: all: hello hello: hello.o main.o gcc -o hello hello.o main.o hello.o: hello.c gcc -o hello.o -c hello.c -W -Wall -ansi -pedantic main.o: main.c hello.h gcc -o main.o -c main.c -W -Wall -ansi -pedantic clean: rm -rf *.o mrproper: clean rm -rf hello 对不起,我真的不明白 makefile.... 谢谢! :)
  • 什么不起作用?显示make 运行的确切命令。是的,在为 GTK 编码时,您真的想学习如何编写 Makefile-s(或者,在终端中键入单个命令来构建您的应用程序,或者制作它的 shell 脚本),因为您将很快就会有您的 GTK 应用程序的多个源文件。
  • 谢谢!使用 $(CC) $(OBJ) $(LDFLAGS) -o $(BIN) 非常感谢! :))
  • 那么请投票或接受我的(改进的)答案!顺便说一句,您可以在 cmets 中使用反引号;它们有一些特殊含义(用于排版代码)。
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2022-10-15
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2012-10-17
相关资源
最近更新 更多