替换.o文件makefile中的所有棋子

Substitute all chess pieces in a .o file makefile

我有一个关于国际象棋项目的 makefile。当前的 make Chess 规则如下所示

Chess: main.o board.o player.o chess.o square.o piece.o position.o pawn.o rook.o king.o queen.o bishop.o knight.o
    $(CC) main.o board.o player.o chess.o square.o piece.o position.o pawn.o rook.o king.o queen.o bishop.o knight.o $(OUTPUT)

我想用这样的东西替换它

Chess: main.o board.o player.o chess.o square.o piece.o position.o chesspieces.o
    $(CC) main.o board.o player.o chess.o square.o piece.o position.o  chesspieces.o $(OUTPUT)

我尝试了什么:

chesspieces.o: ./src/pieces/king.cc ./src/pieces/knight.cc ./src/pieces/bishop.cc ./src/pieces/queen.cc ./src/pieces/pawn.cc ./src/pieces/rook.cc ./src/pieces/piece.cc
    $(CC) $(INCLUDES) ./src/pieces/king.cc ./src/pieces/knight.cc ./src/pieces/bishop.cc ./src/pieces/queen.cc ./src/pieces/pawn.cc ./src/pieces/rook.cc ./src/pieces/piece.cc

给了我一堆对 Position, Square, Board 的未定义引用。棋子是每个棋子继承的抽象class,它包括一个Color和一个Position class,但我已经为[=17=中的那些添加了规则] 规则。我应该再次添加它们吗?还有一个额外的问题:我想将我的目标文件存储在一个单独的文件夹中,这会导致任何问题吗?

我不确定是否可以在不使用怪异技巧的情况下将许多源文件合并到一个对象中。 .o 文件是独立的编译单元,链接器负责合并它们以创建二进制文件(例如库)。

您得到未定义的引用是因为您实际为 chesspieces.o 所做的是生成一个名为 a.out 的可执行文件(如果您使用 gcc)。使用 -c 生成目标文件(每个输入 .cc 文件一个)。

您可能想要重新组织您的 make 目标,通常每个生成的二进制文件都有一个目标。例如如果您创建一个名为 foo:

的静态库
# Rules for pieces/king.o, etc 

foo.a: pieces/king.o pieces/knight.o pieces/bishop.o # ...
  # Combine the object files 
  ar rcs $@ $^

所以要组合你的棋子:


chesspieces.a: # pieces/king.o ...
    ar rcs $@ $^

Chess: ... chesspieces.a
    $(CXX) ... -lchesspieces -L<dir where chesspieces.a is stored> # Links your chesspiece lib to your Chess executable

请注意,在 Linux 上,静态库基本上只是目标文件的存档,因此我们使用 arrcs 来生成静态库。我使用了“魔法”make 变量 $@ (目标名称)和 $^ (目标依赖项)。此外,我们还必须将 -lchesspieces-L<dir> 传递给 Chess 的最终编译,以便链接器可以找到属于 [=26] 的 .o 文件中定义的所有符号=]

通常在构建期间为每个源 (.cc) 文件生成一个 .o 文件作为编译和链接之间的中间步骤

注意:您将问题标记为“cpp”,所以我将 CC 更改为 CXXCC 是 C 编译器 CXX 是 c++ 编译器