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

时间:2019-07-30 06:31:17

标签: makefile include include-path

使用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"之类的包含文件,而没有添加目录信息。据我了解,在-I中添加INCLUDE_DIR标志应该可以解决查找包含文件的问题。

我之前检查过是否将所有.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,但我认为这不是问题。

有什么我想念的东西吗?

我们将不胜感激任何帮助或朝着正确的方向前进。

2 个答案:

答案 0 :(得分:0)

[已删除评论]

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

INCLUDE_DIR := -I./include/tpu_uarch

答案 1 :(得分:0)

对于那些找到答案的人...即使解决了该问题,GM指出,我还有一些小问题。 (例如两个测试文件都包含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

希望这会有所帮助。