即使使用 -I 标志,makefile 也找不到包含文件路径

makefile can't find include file path even with -I flag

使用 Makefile 编译时提示找不到某些包含文件的路径。 这是我的目录布局:

build (empty directory)
include (directory)
    tpu_uarch (directory)
        buffer.hpp common.hpp controller.hpp cpu.hpp
        dram.hpp interconnect.hpp mmu.hpp unit.hpp weightfetcher.hpp
obj (directory)
    tpu_uarch (empty directory)
src (directory)
    test_mmu.cpp test_tile.cpp
    buffer.cpp common.cpp controller.cpp cpu.cpp
    dram.cpp interconnect.cpp mmu.cpp weightfetcher.cpp
Makefile

下面是 Makefile 的样子:

TESTTILE := ./build/testtile.exe
TEST3 := ./build/test3.exe

CC := g++
CPP_SUFFIX := cpp

INCLUDE_DIR := -I./include
SRC_DIR = ./src
OBJ_DIR = ./obj

CFLAGS := -g -Wall -std=c++11
LDFLAGS :=
LIBS :=

# all sources
SRC = $(wildcard $(SRC_DIR)/*.$(CPP_SUFFIX))
SRC += $(wildcard $(SRC_DIR)/**/*.$(CPP_SUFFIX))

# objects
OBJ = $(patsubst $(SRC_DIR)/%.$(CPP_SUFFIX), $(OBJ_DIR)/%.o, $(SRC))

DIR = $(dir $(OBJ))

# executables
testtile: dir $(OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(TESTTILE) $(LIBS)

test3: dir $(OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $(TEST3) $(LIBS)

dir:
    mkdir -p $(DIR)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.$(CPP_SUFFIX)
    $(CC) $(INCLUDE_DIR) $(CFLAGS) -c $< -o $@

clean:
    rm -rf $(OBJ_DIR)
    rm $(TESTTILE)
    rm $(TEST3)

当我在命令行中写入 make test3 时,出现以下错误。

mkdir -p ./obj/ ./obj/ ./obj/tpu_uarch/ ./obj/tpu_uarch/ ./obj/tpu_uarch/ ./obj/tpu_uarch/ ./obj/tpu_uarch/ ./obj/tpu_uarch/ ./obj/tpu_uarch/ ./obj/tpu_uarch/
g++ -I./include -g -Wall -std=c++11 -c src/test_tile.cpp -o obj/test_tile.o
src/test_tile.cpp:1:22: fatal error: common.hpp: No such file or directory
compilation terminated.
Makefile:44: recipe for target 'obj/test_tile.o' failed
make: *** [obj/test_tile.o] Error 1

在所有 *.cpp 文件中,他们添加了像 #include "common.hpp" 这样的包含文件,但没有添加目录信息。据我了解,在 INCLUDE_DIR 中添加 -I 标志应该可以解决查找包含文件的问题。

我之前已经检查过,如果我将所有 .cpp.hpp 文件放在一个目录中并在命令行界面中键入 g++ -g -Wall -std=c++11 -o test3.exe buffer.cpp common.cpp controller.cpp cpu.cpp dram.cpp interconnect.cpp mmu.cpp weightfetcher.cpp test_mmu.cpp,代码可以编译。

在制作 test3.exe 时,没有使用 test_tile.cpp 但我认为这应该不是问题。

有什么我遗漏或应该调查的吗?

任何正确方向的帮助或推动将不胜感激。

[从评论中移出]

您告诉 g++./include 中查找,但根据显示的目录层次结构,common.hpp 和其他 headers 实际上在 ./include/tpu_uarch.你需要...

INCLUDE_DIR := -I./include/tpu_uarch

对于那些前来寻找答案的人...即使在解决了 G.M 的问题之后。指出,我还有一些小问题。 (比如两个测试文件都包含main()函数的冲突等)

在那之后,我设法修复了代码以使其正常工作。 这是 Makefile 的工作版本

TESTTILE := ./build/testtile.exe
TESTMMU := ./build/testmmu.exe

CC := g++
CPP_SUFFIX := cpp

INCLUDE_DIR := -I./include/tpu_uarch
SRC_DIR = ./src
OBJ_DIR = ./obj
BUILD_DIR = ./build

CFLAGS := -g -Wall -std=c++11
LDFLAGS :=
LIBS :=

# all sources
SRC = $(wildcard $(SRC_DIR)/*.$(CPP_SUFFIX))
SRC += $(wildcard $(SRC_DIR)/**/*.$(CPP_SUFFIX))

# objects
OBJ = $(patsubst $(SRC_DIR)/%.$(CPP_SUFFIX), $(OBJ_DIR)/%.o, $(SRC))

DIR = $(dir $(OBJ))

# for tests
TESTTILE_OBJ := ./obj/test_tile.o
TESTMMU_OBJ := ./obj/test_mmu.o

# executables
testtile: dir $(OBJ) $(TESTTILE_OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(TESTTILE_OBJ) -o $(TESTTILE) $(LIBS)

testmmu: dir $(OBJ) $(TESTMMU_OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(TESTMMU_OBJ) -o $(TESTMMU) $(LIBS)

dir:
    mkdir -p $(DIR)

obj/test_tile.o: $(BUILD_DIR)/test_tile.cpp
    $(CC) $(INCLUDE_DIR) $(CFLAGS) -c ./build/test_tile.cpp -o ./obj/test_tile.o

obj/test_mmu.o: $(BUILD_DIR)/test_mmu.cpp
    $(CC) $(INCLUDE_DIR) $(CFLAGS) -c ./build/test_mmu.cpp -o ./obj/test_mmu.o

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.$(CPP_SUFFIX)
    $(CC) $(INCLUDE_DIR) $(CFLAGS) -c $< -o $@


clean:
    rm -rf $(OBJ_DIR)
    rm $(TESTTILE)
    rm $(TEST3MMU)

目录拓扑如下:

build (directory)
    test_mmu.cpp test_tile.cpp
    testmmu.exe testtile.exe (executables created after running make)
include (directory)
    tpu_uarch (directory)
        buffer.hpp common.hpp controller.hpp cpu.hpp
        dram.hpp interconnect.hpp mmu.hpp unit.hpp weightfetcher.hpp
obj (directory, all contents here including directory are created after running make)
    tpu_uarch (directory)
        buffer.o common.o controller.o cpu.o
        dram.o interconnect.o mmu.o weightfetcher.o
    test_mmu.o
    test_tile.o
src (directory)
    tpu_uarch (directory)
        buffer.cpp common.cpp controller.cpp cpu.cpp
        dram.cpp interconnect.cpp mmu.cpp weightfetcher.cpp
Makefile

希望对您有所帮助。