我试图创建一个通用的make文件,这样我就可以独立于我添加到它的文件数量以及我决定将它们放在项目树中的位置来编译我的项目。
在我的一步一步的方法中,我可以使用这个makefile工作正常。
CC=g++
OBJECTS=main.o board.o
VPATH=src:\
src/board:\
include/board:\
build:\
bin
boardG : main.o board.o
$(CC) -o bin/boardG build/main.o build/board.o
main.o : main.cpp board.hpp
$(CC) -c -I include $< -o build/$@
board.o : board.cpp board.hpp
$(CC) -c -I include $< -o build/$@
这个版本可以很好地完成工作。见下面的输出:
me@01:~/code/projects/boardG$ make
g++ -c -I include src/main.cpp -o build/main.o
g++ -c -I include src/board/board.cpp -o build/board.o
g++ -o bin/boardG build/main.o build/board.o
这里的问题是我必须为每个.cpp文件创建一个规则。这正是我试图避免的。因此,我尝试使用匹配的模式调整上面的版本:
CC=g++
OBJECTS=main.o board.o
VPATH=src:\
src/board:\
include/board:\
build:\
bin
boardG : main.o board.o
$(CC) -o bin/boardG build/main.o build/board.o
%.o : %.cpp %.hpp
$(CC) -c -I include $< -o build/$@
当我现在运行make时,我得到了以下输出:
me@01:~/code/projects/boardG$ make
g++ -c -o main.o src/main.cpp
src/main.cpp:2:27: fatal error: board/board.hpp: No such file or directory
compilation terminated.
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1
我的项目中包含以下结构/文件。
./bin/
./build/
./include/board/board.hpp
./src/main.cpp
./src/board/board.cpp
./makefile
我想知道为什么make会在使用模式匹配时更改命令?或者,也许更准确地说,我做错了什么使得失败?
答案 0 :(得分:0)
当涉及到目标文件时,请避免使用VPATH
。发生的事情是,make实际上正在使用%.o
的内置规则而根本不使用您的规则。
如果您在目录中添加了所有对象的前缀,则应该可以使用:
CC=g++
OBJDIR = build
OBJECTS = $(OBJDIR)/main.o $(OBJDIR)/board.o
VPATH = src:\
src/board:\
include/board:\
bin/boardG : $(OBJECTS)
$(CC) -o $@ $^
$(OBJDIR)/%.o : %.cpp %.hpp
$(CC) -c -I include $< -o $@
这是一个helpful resource,或多或少准确地描述了您遇到的问题。