使用 vpath 查找生成的文件
Use vpath to find generated files
我正在尝试编写一个 Makefile,将 *.c
编译成 *.o
,然后将其移动到 obj/
。但是,当我尝试 link main
中的所有 *.o
文件时,我收到一条错误消息,就好像未找到生成的文件一样。我试图在代码前加上正确的路径,但无论如何都找不到。
有没有人知道我需要更改我的代码,以便它确实找到 *.o
文件。
这是我的 Makefile:
EXEC = main
CFLAGS = -c -Wall -g -I include -std=c99
OBJECTS = main.o jeu.o grille.o io.o
EXEC = main
DOCGEN = doxygen
vpath %.c src/
vpath %.h include/
vpath %.o obj/
vpath main bin/
all: main
main: $(OBJECTS)
@echo "\n==== Linking $@ $^ ===="
@gcc -o $@ $(OBJECTS)
@mkdir -p bin
@mv $@ bin/
#@mkdir -p obj
#@mv *.o obj/
main.o: io.h jeu.h
io.o: io.h
jeu.o: jeu.h
%.o: %.c grille.h
@echo "\n---- Rule " $@ $< "----"
@gcc $(CFLAGS) $<
@mkdir -p obj
@mv $@ obj/
doc:
@mkdir -p doc
@$(DOCGEN)
clean:
@rm -rf doc/
@rm -rf bin/
@rm -rf obj/
@rm -f *.xz
欢迎提出任何建议。我读过不建议使用 vpath 来查找生成的文件。但这是一项任务,我必须以这种方式使用它。
如果我取消注释这两行并注释 %.o
规则的最后两行,代码运行良好,但我不能那样做。
这是执行时的错误:
---- Rule main.o src/main.c ----
---- Rule jeu.o src/jeu.c ----
---- Rule grille.o src/grille.c ----
---- Rule io.o src/io.c ----
==== Linking main main.o jeu.o grille.o io.o ====
gcc: error: main.o: No such file or directory
gcc: error: jeu.o: No such file or directory
gcc: error: grille.o: No such file or directory
gcc: error: io.o: No such file or directory
gcc: fatal error: no input files
compilation terminated.
Makefile:15: recipe for target 'main' failed
make: *** [main] Error 1
考虑更改编译规则以引用对象文件夹:
obj/%.o: %.c
[ -d obj ] || mkdir -p obj
gcc -o $@ $<
我正在尝试编写一个 Makefile,将 *.c
编译成 *.o
,然后将其移动到 obj/
。但是,当我尝试 link main
中的所有 *.o
文件时,我收到一条错误消息,就好像未找到生成的文件一样。我试图在代码前加上正确的路径,但无论如何都找不到。
有没有人知道我需要更改我的代码,以便它确实找到 *.o
文件。
这是我的 Makefile:
EXEC = main
CFLAGS = -c -Wall -g -I include -std=c99
OBJECTS = main.o jeu.o grille.o io.o
EXEC = main
DOCGEN = doxygen
vpath %.c src/
vpath %.h include/
vpath %.o obj/
vpath main bin/
all: main
main: $(OBJECTS)
@echo "\n==== Linking $@ $^ ===="
@gcc -o $@ $(OBJECTS)
@mkdir -p bin
@mv $@ bin/
#@mkdir -p obj
#@mv *.o obj/
main.o: io.h jeu.h
io.o: io.h
jeu.o: jeu.h
%.o: %.c grille.h
@echo "\n---- Rule " $@ $< "----"
@gcc $(CFLAGS) $<
@mkdir -p obj
@mv $@ obj/
doc:
@mkdir -p doc
@$(DOCGEN)
clean:
@rm -rf doc/
@rm -rf bin/
@rm -rf obj/
@rm -f *.xz
欢迎提出任何建议。我读过不建议使用 vpath 来查找生成的文件。但这是一项任务,我必须以这种方式使用它。
如果我取消注释这两行并注释 %.o
规则的最后两行,代码运行良好,但我不能那样做。
这是执行时的错误:
---- Rule main.o src/main.c ----
---- Rule jeu.o src/jeu.c ----
---- Rule grille.o src/grille.c ----
---- Rule io.o src/io.c ----
==== Linking main main.o jeu.o grille.o io.o ====
gcc: error: main.o: No such file or directory
gcc: error: jeu.o: No such file or directory
gcc: error: grille.o: No such file or directory
gcc: error: io.o: No such file or directory
gcc: fatal error: no input files
compilation terminated.
Makefile:15: recipe for target 'main' failed
make: *** [main] Error 1
考虑更改编译规则以引用对象文件夹:
obj/%.o: %.c
[ -d obj ] || mkdir -p obj
gcc -o $@ $<