C/GTK - Makefile错误:调用make时未定义对main的引用



我正试图用使用GTK3.0的C文件编写Makefile,但我遇到了以下问题:

/usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/Scrt1.o: in function `_start':
(.text+0x1b): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [makefile:13: sudoku] Error 1
下面是Makefile:
CC := gcc
PKGCONFIG = $(shell which pkg-config)
CFLAGS = $(shell $(PKGCONFIG) --cflags gtk+-3.0)
LIBS = $(shell $(PKGCONFIG) --libs gtk+-3.0)
SRC = src/sudoku.c
OBJS = bin/sudoku.o
$(OBJS): $(SRC)
$(CC) -c $(CFLAGS) -o $(OBJS) $(SRC)
sudoku: $(OBJS)
$(CC) -o $(OBJS) $(LIBS)
.PHONY: clean
clean:
rm -f $(OBJS)
rm -f sudoku

不完全确定这里的问题是什么。根据网上的一些解决方案,源代码可能没有main函数,但在我的src/sudoku.c文件中明确定义了main函数。

另一个问题是sudoku.o文件被错误地放置在makefile所在的目录中(我希望它被放置在bin目录中)。

规则:

sudoku: $(OBJS)
$(CC) -o $(OBJS) $(LIBS)

是错误的,因为您省略了-o编译器选项的参数。因此,在$(OBJS)指定的文件中,第一个(在本例中是唯一的)文件被作为输出文件的名称,而不是要包含在链接中的文件。你可能想要这个,而不是:

sudoku: $(OBJS)
$(CC) -o $@ $(OBJS) $(LIBS)

($@展开为正在构建的目标的名称)。

另外,虽然这个规则在只有一个源文件的情况下可以很好地工作:

$(OBJS): $(SRC)
$(CC) -c $(CFLAGS) -o $(OBJS) $(SRC)

,如果有两个或两个以上,它将中断。我实际上会完全删除它,因为它不做make从C源文件构造目标文件的内置规则也不做的任何事情。

相关内容

最新更新