Makefile 找不到目录 C++

Makefile cant find directories C++

我正在从事与国际象棋相关的项目,我使用 makefile 来编译所有内容。我的目标是只编译已更改的文件,而不是每次都编译所有文件。文件夹结构可以看得更清楚heremake main.o 导致错误:

fatal error: chesspieces.h: No such file or directory
    5 | #include "chesspieces.h"

几乎所有其他东西都给我一个 No rule to make target .o . Stop。我正在使用来自 chess/src 的 make,并且我的 Includes 变量中包含每个文件夹。在此处制作文件:

CC = g++
INCLUDES =-Icomponents -IBoard -Ipieces -IApplication
OUTPUT = -o Chess

Chess: main.o board.o player.o chess.o
    $(CC) main.o board.o player.o chess.o $(OUTPUT)

main.o: main.cc board.h chess.h player.h chesspieces.h
    $(CC) $(INCLUDES) -c main.cc

position.o: position.cc position.h
    $(CC) $(INCLUDES) -c position.cc
    
piece.o: piece.cc piece.h color.h position.h
    $(CC) $(INCLUDES) -c piece.cc

rook.o: rook.cc rook.h piece.h
    $(CC) $(INCLUDES) -c rook.cc

queen.o: queen.cc queen.h piece.h
    $(CC) $(INCLUDES) -c queen.cc

pawn.o: pawn.cc pawn.h piece.h
    $(CC) $(INCLUDES) -c pawn.cc

knight.o: knight.cc knight.h piece.h
    $(CC) $(INCLUDES) -c knight.cc

king.o: king.cc king.h piece.h
    $(CC) $(INCLUDES) -c king.cc

bishop.o: bishop.cc bishop.h piece.h
    $(CC) $(INCLUDES) -c bishop.cc

square.o: square.cc square.h color.h position.h
    $(CC) $(INCLUDES) -c square.cc

board.o: board.cc board.h square.h position.h
    $(CC) $(INCLUDES) -c board.cc

player.o: player.cpp player.h board.h piece.h
    $(CC) $(INCLUDES) -c player.cc

chess.o: chess.cc chess.h player.h board.h piece.h
    $(CC) $(INCLUDES) -c chess.cc

建立依赖关系我的想法是添加文件中包含的每个 header,对此不确定

编辑:在命令行上编译工作正常(除了链接错误) g++ -Icomponents -IBoard -IPieces -Iapplication main.cc 所以 $(INCLUDES) 变量有问题,不知道为什么但它是空白的:g++ -c -o main.o main.cc main.cc:5:10: fatal error: chesspieces.h: No such file or directory

Folders1 Folders2

'Makefile' 文件的变量 'INCLUDES' 包含命令行开关,告诉编译器在哪个目录中查找包含文件。 '-Ipieces' 键告诉编译器在当前目录的名为 'pieces' 的子目录中查找包含文件。文件 'chesspieces.h' 应位于变量 'INCLUDES'.

中列举的子目录之一

你问题中没有说清楚的是你的目录结构,或者你运行make时所在的目录。通过查看 github 存储库,我们可以看到您的 makefile 在根目录中,而您的源文件在子目录中:例如您有 src/main.ccsrc/Application/chess.cc

但是在您的 makefile 中,您没有提供任何路径。您的规则是:

main.o: main.cc board.h chess.h player.h chesspieces.h
        $(CC) $(INCLUDES) -c main.cc

您在此处提到的这些文件不存在,因此 make 将失败。我实际上对你如何得到你现在的行为感到困惑:你应该得到这样的错误,No rule to build main.cc 或类似的东西。

也许您不在源代码树的根目录中 运行 make,而是在其他地方?在这种情况下 make 无法找到您的 makefile,它只是使用默认规则,这解释了为什么找不到您的 INCLUDES 变量。