2014-01-15 33 views
0

我在我的makefile以下规则:使多个类似的规则

pieces = King Queen Knight Rook Bishop Pawn 

Chess: ChessMain.o ChessBoard.o 
g++ -Wall -g ChessMain.o ChessBoard.o -o Chess 

ChessMain: ChessBoard.hpp ChessMain.cpp 
g++ -Wall -g -c ChessMain.cpp -o ChessMain.o 

ChessBoard: ChessBoard.hpp ChessBoard.cpp 
g++ -Wall -g -c ChessBoard.cpp -o ChessBoard.o 

Piece: Piece.cpp Piece.hpp 
g++ -c Piece.cpp -o Piece.o 

King: King.cpp King.hpp Piece 
    g++ -c King.cpp -o King.o 

Rook: Rook.cpp Rook.hpp Piece 
    g++ -c Rook.cpp -o Rook.o 

... 

和所有其他棋子(的Piece子类)相似。我如何将这些特定的规则缩短为一条通用规则?我试过

$(pieces): $([email protected]:=.cpp) $([email protected]:=.hpp) 
    g++ -c $([email protected]:=.cpp) -o $([email protected]:=.o) 

但它不起作用。


我在编辑的完整文件。

+0

它不起作用 - 会发生什么?我假设你正确地缩进了g ++行... –

回答

2

您展示生成文件是不正确的。所有规则都应使用它们实际构建的文件名作为目标名称。因此,生成Piece.o输出文件的目标名称为Piece的规则是错误的。

其次,您不需要使目标文件依赖于其他目标文件。对象文件只依赖于它们的源文件和头文件。

第三,当然你可以创建一个这样的规则(见GNU就隐含规则手册章节,如模式规则):

all: King.o Piece.o Rook.o 

%.o : %.cpp %.h 
     $(COMPILE.cpp) -o [email protected] $< 

就大功告成了。显然你的makefile还有更多的东西(大概你把这些目标文件链接到一个程序中),但是因为你没有展示任何其他的东西,所以我们可以提供帮助。

ETA:上面显示的(第一个)makefile不正确。例如,你的Chess目标列表ChessMain.o是一个先决条件,但是你的makefile中没有规定如何构建该文件的规则(你说如何构建ChessMain但这显然不是一回事,Make很可能会使用它自己的内置了这一点,这就是不同之处在于不会有任何先决条件,所以当标题更改也不会重建文件确定规则

你可以写你的makefile是这样的:

CXX  = g++ 
CXXFLAGS = -Wall -g 

pieces = King Queen Knight Rook Bishop Pawn 

Chess: ChessMain.o ChessBoard.o $(addsuffix .o,$(pieces)) 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS) 

%.o : %.cpp %.hpp 
     $(COMPILE.cpp) -o [email protected] $< 

这它,这是整个makefile。摆脱一切(根据你的例子)

我应该指出,这可能不够好。例如,如果这里列出的先决条件足够,我会感到震惊。当然,没有任何.cpp文件每个都包含除自己以外的任何头文件.hpp?当然ChessMain.cpp文件例如必须#includeKing.hpp文件等?这种关系在这里没有表现出来,所以重建将不可靠。

+1

如果OP真的想让'King'制作'King.o',那么他可以添加一个直接规则'King:King.o'(不需要动作),和'。凤凰:国王骑士女王主教典当'统治,因为他们是虚假的目标。但是,似乎不太必要。 –

+0

某些目标名称由教师提供,所以我只是遵循类似的“Piece”格式... – Moronic