C++ 使用隐式规则生成文件错误

C++ 使用隐式规则生成文件错误,c++,makefile,C++,Makefile,正在尝试为我的项目组装Makefile。我正在使用for对象文件,但运行make compile失败,并生成以下错误: g++ -Wall -pedantic -std=c++11 -Wno-long-long -O0 -ggdb ./main.o ./AI.o ./BoardData.o ./Circle.o ./Coordination.o ./Cross.o ./GameField.o ./GameLogic.o ./GraficObject.o ./INetwork.o ./IUserI

正在尝试为我的项目组装Makefile。我正在使用for对象文件,但运行
make compile
失败,并生成以下错误:

g++ -Wall -pedantic -std=c++11 -Wno-long-long -O0 -ggdb ./main.o ./AI.o ./BoardData.o ./Circle.o ./Coordination.o ./Cross.o ./GameField.o ./GameLogic.o ./GraficObject.o ./INetwork.o ./IUserInterface.o ./LocalHuman.o ./LocalPlayer.o ./NetworkException.o ./NetworkTCP.o ./NetworkTCPClient.o ./NetworkTCPServer.o ./Player.o ./PlayerRotator.o ./RemotePlayer.o ./Stone.o ./UserInterfaceNcurse.o -o ./game -lcurses
g++: error: ./main.o: No such file or directory
g++: error: ./AI.o: No such file or directory
g++: error: ./BoardData.o: No such file or directory
g++: error: ./Circle.o: No such file or directory
g++: error: ./Coordination.o: No such file or directory
g++: error: ./Cross.o: No such file or directory
g++: error: ./GameField.o: No such file or directory
g++: error: ./GameLogic.o: No such file or directory
g++: error: ./GraficObject.o: No such file or directory
g++: error: ./INetwork.o: No such file or directory
g++: error: ./IUserInterface.o: No such file or directory
g++: error: ./LocalHuman.o: No such file or directory
g++: error: ./LocalPlayer.o: No such file or directory
g++: error: ./NetworkException.o: No such file or directory
g++: error: ./NetworkTCP.o: No such file or directory
g++: error: ./NetworkTCPClient.o: No such file or directory
g++: error: ./NetworkTCPServer.o: No such file or directory
g++: error: ./Player.o: No such file or directory
g++: error: ./PlayerRotator.o: No such file or directory
g++: error: ./RemotePlayer.o: No such file or directory
g++: error: ./Stone.o: No such file or directory
g++: error: ./UserInterfaceNcurse.o: No such file or directory
make: *** [game] Error 1
这是我的MakeFile:

CXX=g++
CXXFLAGS=-Wall -pedantic -std=c++11 -Wno-long-long -O0 -ggdb
CXXLIBS=-lcurses
OBJECTS= ./main.o ./AI.o ./BoardData.o ./Circle.o ./Coordination.o ./Cross.o \
    ./GameField.o ./GameLogic.o ./GraficObject.o ./INetwork.o ./IUserInterface.o \
    ./LocalHuman.o ./LocalPlayer.o ./NetworkException.o ./NetworkTCP.o \
    ./NetworkTCPClient.o ./NetworkTCPServer.o ./Player.o ./PlayerRotator.o \
    ./RemotePlayer.o ./Stone.o ./UserInterfaceNcurse.o
DOXYFILE=./doxyfile
BINARY=./game
SOURCE_DIR=./src/
DOC_DIR=./doc/

################################################################################

.PHONY : all
.PHONY : compile
.PHONY : run
.PHONY : clean
.PHONY : doc

################################################################################

all: $(OBJECTS) $(DOXYFILE)
    make compile
    make doc

compile: $(BINARY)

run: $(BINARY)
    $(BINARY)

clean:
    -rm -rf $(DOC_DIR) $(BINARY) $(OBJECTS)

doc: $(DOXYFILE)
    -mkdir $(DOC_DIR)
    doxygen $(DOXYFILE)

################################################################################

$(BINARY): $(OBJECTS)
    $(CXX) $(CXXFLAGS) $(OBJECTS) -o $(BINARY) $(CXXLIBS)

################################################################################

## Using Implicit Rules for all object files
## Generated by g++ -MM ./src/*.cpp

main.o: ./src/main.cpp ./src/IUserInterface.h ./src/Coordination.h \
 ./src/UserInterfaceNcurse.h ./src/GraficObject.h ./src/Cross.h ./src/Stone.h \
 ./src/Circle.h ./src/GameField.h ./src/LocalHuman.h ./src/LocalPlayer.h \
 ./src/Player.h ./src/INetwork.h ./src/GameLogic.h ./src/BoardData.h ./src/AI.h \
 ./src/RemotePlayer.h ./src/PlayerRotator.h ./src/NetworkTCPClient.h \
 ./src/NetworkTCP.h ./src/NetworkException.h ./src/NetworkTCPServer.h
AI.o: ./src/AI.cpp ./src/AI.h ./src/LocalPlayer.h ./src/Player.h \
 ./src/IUserInterface.h ./src/Coordination.h ./src/INetwork.h ./src/GameLogic.h \
 ./src/BoardData.h ./src/Stone.h ./src/GraficObject.h
BoardData.o: ./src/BoardData.cpp ./src/BoardData.h ./src/Coordination.h
Circle.o: ./src/Circle.cpp ./src/Circle.h ./src/Stone.h ./src/GraficObject.h \
 ./src/IUserInterface.h ./src/Coordination.h
Coordination.o: ./src/Coordination.cpp ./src/Coordination.h
Cross.o: ./src/Cross.cpp ./src/Cross.h ./src/Stone.h ./src/GraficObject.h \
 ./src/IUserInterface.h ./src/Coordination.h
GameField.o: ./src/GameField.cpp ./src/GameField.h ./src/GraficObject.h \
 ./src/IUserInterface.h ./src/Coordination.h
GameLogic.o: ./src/GameLogic.cpp ./src/GameLogic.h ./src/BoardData.h \
 ./src/Coordination.h
GraficObject.o: ./src/GraficObject.cpp ./src/GraficObject.h \
 ./src/IUserInterface.h ./src/Coordination.h
INetwork.o: ./src/INetwork.cpp ./src/INetwork.h ./src/Coordination.h
IUserInterface.o: ./src/IUserInterface.cpp ./src/IUserInterface.h \
 ./src/Coordination.h
LocalHuman.o: ./src/LocalHuman.cpp ./src/LocalHuman.h ./src/LocalPlayer.h \
 ./src/Player.h ./src/IUserInterface.h ./src/Coordination.h ./src/INetwork.h \
 ./src/GameLogic.h ./src/BoardData.h ./src/Stone.h ./src/GraficObject.h
LocalPlayer.o: ./src/LocalPlayer.cpp ./src/LocalPlayer.h ./src/Player.h \
 ./src/IUserInterface.h ./src/Coordination.h ./src/INetwork.h ./src/GameLogic.h \
 ./src/BoardData.h ./src/Stone.h ./src/GraficObject.h
NetworkException.o: ./src/NetworkException.cpp ./src/NetworkException.h
NetworkTCPClient.o: ./src/NetworkTCPClient.cpp ./src/NetworkTCPClient.h \
 ./src/NetworkTCP.h ./src/INetwork.h ./src/Coordination.h \
 ./src/NetworkException.h
NetworkTCP.o: ./src/NetworkTCP.cpp ./src/NetworkTCP.h ./src/INetwork.h \
 ./src/Coordination.h
NetworkTCPServer.o: ./src/NetworkTCPServer.cpp ./src/NetworkTCPServer.h \
 ./src/NetworkTCP.h ./src/INetwork.h ./src/Coordination.h \
 ./src/NetworkException.h
Player.o: ./src/Player.cpp ./src/Player.h ./src/IUserInterface.h \
 ./src/Coordination.h ./src/INetwork.h ./src/GameLogic.h ./src/BoardData.h \
 ./src/Stone.h ./src/GraficObject.h
PlayerRotator.o: ./src/PlayerRotator.cpp ./src/PlayerRotator.h ./src/Player.h \
 ./src/IUserInterface.h ./src/Coordination.h ./src/INetwork.h ./src/GameLogic.h \
 ./src/BoardData.h ./src/Stone.h ./src/GraficObject.h
RemotePlayer.o: ./src/RemotePlayer.cpp ./src/RemotePlayer.h ./src/Player.h \
 ./src/IUserInterface.h ./src/Coordination.h ./src/INetwork.h ./src/GameLogic.h \
 ./src/BoardData.h ./src/Stone.h ./src/GraficObject.h
Stone.o: ./src/Stone.cpp ./src/Stone.h ./src/GraficObject.h \
 ./src/IUserInterface.h ./src/Coordination.h
UserInterfaceNcurse.o: ./src/UserInterfaceNcurse.cpp \
 ./src/UserInterfaceNcurse.h ./src/IUserInterface.h ./src/Coordination.h \
 ./src/GraficObject.h

您需要更多地依赖于Make为您提供的自动化工具

我认为您真正的问题在于,您的源文件位于
src
目录中,而
OBJECTS
变量将它们列在当前(
)目录中

此外,您实际上是在递归调用自己的makefile,这是可以避免的

另外+1用于使用合适的
CXX*
变量

好的,现在:

BINARY:=game#`:=`运算符阻止进一步扩展
DOC_DIR:=DOC
DOC:=doxyfile
SRC_DIR:=SRC
SRC:=$(通配符$(SRC_DIR)/*.cpp)#自动列出所有.cpp文件
OBJ_DIR:=构建
OBJ:=$(SRC:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o),即SRC/toto.cpp->build/toto.o
DEP:=$(对象:.o=.d)#即build/toto.o->build/toto.d
#无需重新定义已包含“g++”的$(CXX)
CPPFLAGS:=-MMD-MP#将随链接步骤自动生成依赖项
cxflags:=-Wall-pedantic-std=c++11-Wno long-O0-ggdb
LDFLAGS:=#-L个标志
LDLIBS:=-lcurses#-l标志
.冒牌货:所有的医生都是清白的
#我们希望在键入“make”时构建二进制文件和文档
全部:$(二进制)文档
#二进制文件需要编译源代码
$(二进制):$(OBJ)
$(CXX)$(LDFLAGS)$^$(LDLIBS)-o$@
#我们只想在编译源文件之前创建一次“build”目录
#为给定的src/.cpp文件创建build/.o和build/.d文件,并生成依赖项
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp|$(OBJ_DIR)
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<
$(OBJ_DIR):
@mkdir$@
-include$(DEP)#包括自动生成的依赖项规则
文件:
@mkdir-p$(DOC_DIR)#-p以避免出现错误(如果存在)
doxygen$(DOC)
运行:$(二进制)
./$(二进制)

没有。。。这些都是你亲手写的吗?@Chnossos除了最后一部分。。。是的,将.cpp的模式规则添加到.o编译中可以解决问题吗?好的,那么现在,您的源文件是在当前目录中还是在
src
目录中?为什么您要事先生成
.o
规则,然后将它们复制/粘贴到您的Makefile中,而不是让Makefile自动处理该步骤?@doron如果您所说的模式规则是指
$(CXX)-c$(CXXFLAGS)$(CXXLIBS)-o$@$找到了我要查找的内容。我将首先用文档回顾所有更改。我只有两个问题。确切地说,何时调用
-include$(DEP)#includes自动生成的依赖项规则
,何时关联*.d文件(我猜在
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp
。并且DIR位置始终与*.o文件相同)?
.d
文件确实是在该规则内生成的,以及
.o
文件。如果需要,您可以使用
-MF
选项更改位置。通常我更喜欢将这些文件隐藏在隐藏的
.obj
文件夹中
-include$(DEP)
扩展为
-include file1.d file2.d…
。至于什么时候叫,我不知道确切的时间,但你可以了解更多。