C/GTK - Makefile error: undefined reference to main when invoking make

C/GTK - Makefile error: undefined reference to main when invoking make

我正在尝试用一个使用 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

这是生成文件:

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) 指定的文件中的第一个(在本例中是唯一的)文件被用作输出文件的名称,而不是包含在 link 中的文件。您可能想要这个,而不是:

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

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

此外,尽管只有一个源文件时此规则也能正常工作:

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

,有两个以上就断了。我实际上会完全删除它,因为它不会做 make 的 built-in 从 C 源文件构造目标文件的规则也不会做的任何事情。