代码之家  ›  专栏  ›  技术社区  ›  zayaanra

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

  •  0
  • zayaanra  · 技术社区  · 2 年前

    我试图用一个利用GTK3的C文件编写一个Makefile。0但我遇到了以下问题:

    /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
    

    不完全确定这里的问题是什么。根据一些在线解决方案,源代码可能没有主功能,但在我的 src/sudoku.c 文件

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

    1 回复  |  直到 2 年前
        1
  •  1
  •   John Bollinger    2 年前

    这条规则:

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

    是错误的,因为你把论点遗漏了 -o 编译器选项。因此,由 $(OBJS) 将作为输出文件的名称,而不是要包含在链接中的名称。你大概想要这个:

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

    ( $@ 扩展到正在生成的目标的名称)。

    此外,尽管此规则在只有一个源文件时足够有效:

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

    ,如果有两个或更多,它将断开。实际上,我会将其完全移除,因为它不会做任何 make 从C源文件构造对象文件的内置规则也不适用。