【发布时间】:2016-04-12 16:52:27
【问题描述】:
我正在尝试创建一个通用的 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 在使用模式匹配时会更改命令?或者,也许更准确地说,我做错了什么导致 make 失败?
【问题讨论】:
-
这可能是使用内置的
%.o: %.cpp规则,因为它找不到与您的目标匹配的%.hpp文件。禁用这些规则 (-r),您应该会看到它以不同的方式失败。运行make -d可能有助于向您展示 make 在找到您的目标时试图做什么。 (我不确定 VPATH 如何在单个目标中处理多个模式先决条件。) -
你有一些规则来构建文件而不是他们承诺构建的文件(例如
build/board.o而不是board.o),以及与这个小说一起玩的另一个规则,声称需要未构建的文件,然后使用已构建的文件。当您尝试对其进行概括时,这自然会中断。