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 $@ $<
我正在尝试使用不同子文件夹中的文件制作一个简单的 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 $@ $<