makefile,从不同路径编译文件时出错

makefile, error compiling files from different paths

我有 2 个文件夹,第一个文件夹包含我构建的文件,第二个文件夹包含我应该使用而不更改的文件,所有文件同步和工作,已经通过手动编译测试并合并1 个文件夹,

    CC:=g++
    COURSE_DIR:=/home/mtm/public/2122b/
    HW_DIR:=$(COURSE_DIR)ex2/
    OBJS=Card.o Player.o utilities.o Mtmchkin.o test.o
    EXEC=mtmchkin_test
    DEBUG_FLAG:=-g -DNDEBUG#assign -g for debug, or -DNDEBUG to turnoff assert
    HW_FLAG=-I -I$(HW_DIR)
    COMP_FLAG=--std=c++11 -Wall -pedantic-errors -Werror $(HW_FLAG)
    
    $(EXEC) : $(OBJS)
            $(CC) $(DEBUG_FLAG) $(COMP_FLAG) $(OBJS) -o $@
    Card.o : Card.cpp $(HW_DIR)Card.h Player.h $(HW_DIR)utilities.h
            $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
    Player.o : Player.cpp Player.h $(HW_DIR)utilities.h $(HW_DIR)Card.h
            $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
    utilities.o : $(HW_DIR)utilities.cpp $(HW_DIR)utilities.h
            $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
    Mtmchkin.o : Mtmchkin.cpp Mtmchkin.h $(HW_DIR)Card.h Player.h $(HW_DIR)utilities.h
            $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
    test.o : $(HW_DIR)test.cpp Player.h $(HW_DIR)Card.h Mtmchkin.h $(HW_DIR)utilities.h
            $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
    clean:
        rm -f $(OBJS) $(EXEC)

makefile 在我提到的第一个文件夹中,HW_DIR 是我提到的第二个文件夹的路径,但它没有编译。知道问题是什么以及如何解决吗?

编辑: 这是我从我提到的第一个文件夹中得到的输入,包含 makefile 和输出

    [final]$ make
    g++ -c -g -DNDEBUG --std=c++11 -Wall -pedantic-errors -Werror -I -I/home/mtm/public/2122b/ex2/ Card.cpp -o Card.o
    Card.cpp:1:18: fatal error: Card.h: No such file or directory
     #include "Card.h"
                      ^
    compilation terminated.
    make: *** [Card.o] Error 1

我想让它编译成功,然后把 exec 文件和 makefile 放在同一个文件夹里。

您的问题似乎是:

HW_FLAG=-I -I$(HW_DIR)

这会将包含路径设置为 -I/home/mtm/public/2122b/ex2/,它(作为相对路径,因为它以 - 开头)将是当前目录下的一个(可能不存在的)目录。

应该是:

HW_FLAG=-I $(HW_DIR)

GCC's command line documentation 表明 -I 可以在其参数前有一个 space。

此外,请确保包含文件所在的所有不同文件夹都在包含路径中表示。如果(看起来)在与 makefile 相同的文件夹中有 .h 个文件,您可以尝试

 -I . -I $(HW_DIR)

但是,您可能需要指定 makefile 的完整路径而不是 .

最后,$* 无法用于编译 $(HW_DIR)utilities.cpp$(HW_DIR)test.cpp,因为它们与目标 utilities.o 和 [=22= 位于不同的目录中]. (documentation link)。只需使用例如$(HW_DIR)\utilities.cpp 明确用于该规则,而不是 $*.cpp