Makefile make文件格式有什么问题

Makefile make文件格式有什么问题,makefile,Makefile,我用gedit为我的小项目编写了一个makefile。 当我运行“make”时,所有*.o和可执行文件都被创建。 一旦我更改了我的一个文件(没有makeclean或make-B) 显示它再次编译更改文件并再次链接所有对象。 但是,可执行文件的工作方式没有任何变化。 (在“make-B”之后,可执行文件运行正常) 如果对make文件的设计有其他问题或建议,我将很高兴听到 编辑 1) 该程序不会在屏幕上打印任何内容。 2) 更改位于king.cpp文件(位于另一个文件夹)中。将更改打印到屏幕 [

我用gedit为我的小项目编写了一个makefile。 当我运行“make”时,所有*.o和可执行文件都被创建。 一旦我更改了我的一个文件(没有makeclean或make-B) 显示它再次编译更改文件并再次链接所有对象。 但是,可执行文件的工作方式没有任何变化。 (在“make-B”之后,可执行文件运行正常)

如果对make文件的设计有其他问题或建议,我将很高兴听到

编辑 1) 该程序不会在屏幕上打印任何内容。 2) 更改位于king.cpp文件(位于另一个文件夹)中。将更改打印到屏幕

  [av@ArchlinuxAvichai chess]$ ls
  chess  ex1  Makefile
  [av@ArchlinuxAvichai chess]$ ls chess
  board.cpp  board.hpp  game.cpp  movement.cpp  tools
  [av@ArchlinuxAvichai chess]$ ls chess/tools
  bishop.cpp  king.cpp  knight.cpp  pawn.cpp  queen.cpp  rook.cpp     tool.hpp

  [av@ArchlinuxAvichai chess]$ make
  g++ -Wall -c chess/tools/pawn.cpp
  g++ -Wall -c chess/tools/knight.cpp
  g++ -Wall -c chess/tools/bishop.cpp
  g++ -Wall -c chess/tools/rook.cpp
  g++ -Wall -c chess/tools/queen.cpp
  g++ -Wall -c chess/tools/king.cpp
  g++ -Wall -c chess/board.cpp
  g++ -Wall -c chess/movement.cpp
  g++ -Wall -c chess/game.cpp 
  g++ -Wall pawn.o knight.o bishop.o rook.o queen.o king.o board.o   movement.o game.o  -o ex1
  [av@ArchlinuxAvichai chess]$ ./ex1
  [av@ArchlinuxAvichai chess]$ *** AT this stage i change the file
  [av@ArchlinuxAvichai chess]$ 
  [av@ArchlinuxAvichai chess]$ make
  g++ -Wall -c chess/tools/king.cpp
  g++ -Wall pawn.o knight.o bishop.o rook.o queen.o king.o board.o  movement.o game.o  -o ex1
  [av@ArchlinuxAvichai chess]$ ./ex1
  [av@ArchlinuxAvichai chess]$ 
  [av@ArchlinuxAvichai chess]$ make -B
  g++ -Wall -c chess/tools/pawn.cpp
  g++ -Wall -c chess/tools/knight.cpp
  g++ -Wall -c chess/tools/bishop.cpp
  g++ -Wall -c chess/tools/rook.cpp
  g++ -Wall -c chess/tools/queen.cpp
  g++ -Wall -c chess/tools/king.cpp
  g++ -Wall -c chess/board.cpp
  g++ -Wall -c chess/movement.cpp
  g++ -Wall -c chess/game.cpp 
  g++ -Wall pawn.o knight.o bishop.o rook.o queen.o king.o board.o  movement.o game.o  -o ex1
  [av@ArchlinuxAvichai chess]$ ./ex1
  Print Change
  [av@ArchlinuxAvichai chess]$

请尝试以下生成文件:

CXX := g++
CXXFLAGS := -Wall
OBJS := pawn.o knight.o bishop.o rook.o queen.o king.o board.o movement.o game.o

COMPILE_CMD = ${CXX} -c -o $@ ${CXXFLAGS} -MD -MP $<
LINK_CMD = ${CXX} -o $@ ${LDFLAGS} $^

all: ex1

ex1: ${OBJS}
    ${LINK_CMD}

%.o : chess/tools/%.cpp
    ${COMPILE_CMD}

%.o : chess/%.cpp
    ${COMPILE_CMD}

-include $(OBJS:%.o=%.d)

clean:
    rm -f *.o *.d

.PHONY: clean all
CXX:=g++
CXXFLAGS:=-Wall
对象:=当兵。哦骑士。哦主教。哦车。哦皇后。哦国王。哦棋盘。o移动。o游戏。o游戏
COMPILE_CMD=${CXX}-c-o$@${CXXFLAGS}-MD-MP$<
LINK_CMD=${CXX}-o$@${LDFLAGS}$^
全部:ex1
ex1:${OBJS}
${LINK_CMD}
%.o:chess/tools/%.cpp
${COMPILE_CMD}
%.o:chess/%.cpp
${COMPILE_CMD}
-包括$(对象:%.o=%.d)
清洁:
rm-f*.o*.d
.冒牌货
变化:

使用C++代码> ${CXX} C++代码。
  • 自动生成标题依赖项
  • 使用模式规则避免重复
  • 指定
    .o
    输出文件
  • 将目标
    clean
    all
    标记为
    .PHONY
  • 使用
    LDFLAGS
    进行链接

  • 只是澄清一下,如果更改源文件并运行
    make
    则正在生成目标文件,但未重新链接可执行文件
    ex1
    ?您能否将
    make
    的输出复制粘贴到您的问题中,以便我们查看其输出?你是如何运行你的应用程序的?在生成程序时或运行程序之前,您是否随时更改目录?如果没有
    -o
    标记为
    $(CC)
    ,则会在源文件旁边创建目标文件。假设您更改了
    chess/tools/king.cpp
    并说
    make
    ,那么您将得到一个新的
    chess/tools/king.o
    。但是
    ex1
    想要链接到
    king.o
    而不是
    chess/tools/king.o
    。这并不能解释为什么
    make-B
    会有帮助,所以可能我遗漏了什么?你在编译之前是否保存了更改的文件?@MaximEgorushkin是的,否则make-B不应该打印新版本
    CXX := g++
    CXXFLAGS := -Wall
    OBJS := pawn.o knight.o bishop.o rook.o queen.o king.o board.o movement.o game.o
    
    COMPILE_CMD = ${CXX} -c -o $@ ${CXXFLAGS} -MD -MP $<
    LINK_CMD = ${CXX} -o $@ ${LDFLAGS} $^
    
    all: ex1
    
    ex1: ${OBJS}
        ${LINK_CMD}
    
    %.o : chess/tools/%.cpp
        ${COMPILE_CMD}
    
    %.o : chess/%.cpp
        ${COMPILE_CMD}
    
    -include $(OBJS:%.o=%.d)
    
    clean:
        rm -f *.o *.d
    
    .PHONY: clean all