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 源文件构造目标文件的规则也不会做的任何事情。
我正在尝试用一个使用 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 源文件构造目标文件的规则也不会做的任何事情。