Makefile compliation 问题 cannot find *.o no such file or directory

Makefile compliation issue cannot find *.o no such file or directory

我正在尝试使用不同子文件夹中的文件制作一个简单的 Makefile。这是我的 Makefile

CFLAGS = -g -Wall
IFLAGS = -Iinclude
OPATH = obj/
CPATH = src/

vpath %.h include
vpath %.c src
vpath %.o obj
vpath main bin



main: main.o grille.o io.o jeu.o
    gcc $(CFLAGS) -o main $(OPATH)main.o $(OPATH)grille.o $(OPATH)io.o $(OPATH)jeu.o 
    mv $@ bin/
main.o: main.c grille.h io.h jeu.h
    


grille.o : grille.c grille.h
    

io.o: io.c io.h
    

jeu.o: jeu.c jeu.h
    

%.o : 
    gcc $(CFLAGS) -c $< $(IFLAGS)
    mv $@ $(OPATH)

clean:
    rm obj/* bin/*

我的文件位于名为 src、obj 和 include 的子文件夹中。 我得到这个错误

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find obj/main.o: No such file or directory
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find obj/grille.o: No such file or directory
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find obj/io.o: No such file or directory
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find obj/jeu.o: No such file or directory
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:15: main] Error 1

ERROR

有什么解决办法吗?

将输出文件写入与输入文件不同的目录需要额外的设置。您应该查看 make 运行的编译行。它是否将目标文件放在正确的位置?如果不是,那么这就解释了为什么你会得到这些 link 错误:目标文件不存在你告诉 linker 它们会存在的地方,所以它失败了。

这条规则不对:

%.o : 
        gcc $(CFLAGS) -c $< $(IFLAGS)
        mv $@ $(OPATH)

此外,您不能使用 vpath 搜索由 makefile 构建的目标。那是行不通的。 vpath 只能用于搜索源文件(如 .c.h 文件)。所以这些行没有做任何事情,应该被删除:

vpath %.o obj
vpath main bin

这些规则不对:您需要将对象目录放在这里:

grille.o : grille.c grille.h
io.o: io.c io.h
jeu.o: jeu.c jeu.h

你想要这样的东西:

CC = gcc
CFLAGS = -g -Wall
IFLAGS = -Iinclude
OPATH = obj/

vpath %.h include
vpath %.c src

bin/main: obj/main.o obj/grille.o obj/io.o obj/jeu.o
    $(CC) $(CFLAGS) -o $@ $^

main.o: main.c grille.h io.h jeu.h
grille.o : grille.c grille.h
io.o: io.c io.h
jeu.o: jeu.c jeu.h

$(OPATH)%.o : %.c
        $(CC) $(CFLAGS) $(IFLAGS) -c -o $@ $<