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



用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标志应该解决查找Include Files的问题。

我之前曾检查过,如果我将所有.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和其他标题实际上在./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

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新