包括在 makefile 中找不到的

Includes not found in a makefile

我已经在这个 makefile 上工作了很长一段时间,但我找不到问题的解决方案。这是生成文件:

# Compiler:
CPPFLAGS = $(OPT_FLAGS) $(DEBUG_FLAGS) $(STANDARD_FLAGS) \
           $(WARN_AS_ERRORS_FLAGS)

# Source files, headers, etc.:
OBJ_DIR      = $(CX_BUILD_ROOT)/tests/unit
OUT_DIR      = $(CX_BUILD_ROOT)/tests/unit
INCLUDES     = -I$(CX_SRC_ROOT)/cXbase/publicAPI
LIBINCLUDES  = -L$(CX_BUILD_ROOT)/connectx/libs
VPATH        = tests

SRCS      = cxUnitTests.cpp\
            test_Player.cpp\
            test_Name.cpp\
            test_Game.cpp\
            test_GameBoard.cpp\
            test_Disc.cpp\
            test_Color.cpp\
            test_AsciiColorCode.cpp\

OBJS      = test_Player.o\
            test_Name.o\
            test_Game.o\
            test_GameBoard.o\
            test_Disc.o\
            test_Color.o\
            test_AsciiColorCode.o\

LIBS      = -lgtest\
            -lgtest_main\
            -lpthread\
            -lcXbase

# Product:
MAIN = cxUnitTests.out


all: make_dir $(MAIN)

$(MAIN): $(OBJS)
    @echo Invoquing GCC...
    $(CPPC) $(LIBINCLUDES) -o $(OUT_DIR)/$(MAIN) $(OBJS) $(LIBS)
    @echo $(MAIN) has been compiled and linked!

$(OBJ_DIR)/%.o: %.cpp
    @echo Invoquing GCC...
    $(CPPC) $(CPPFLAGS) $(INCLUDES) -c $< -o $@
    @echo Object files created!

make_dir:
    mkdir -p $(OBJ_DIR)
    mkdir -p $(OUT_DIR)

clean:
    @echo Removing object files...
    $(RM) $(OBJ_DIR)/*.o
    @echo Object files removed!

mrproper: clean
    @echo Cleaning project...
    $(RM) $(OUT_DIR)/$(MAIN)
    @echo Project cleaned!

depend: $(SRCS)
    @echo Finding dependencies...
    makedepend $(INCLUDES) $^
    @echo Dependencies found!

"Source files, headers, etc" 部分中的所有值都在使用 $(MAKE) -C 选项调用此 makefile 的其他 makefile 中定义它们都可以 @echoed 并且结果值是好的.当我 运行 make 时,我得到:

g++ -g3 -std=c++0x -pedantic-errors -Wall -Wextra -Werror -Wconversion -c -o test_Player.o tests/test_Player.cpp

tests/test_Player.cpp:36:30: fatal error: publicAPI/Player.h: No such file or directory

似乎 make 由于某种原因无法访问 INCLUDES 变量的内容。我使用 Gnu-make。

你能看出哪里出了问题吗?

此致

Make 正在使用其内置规则编译 C++ 文件,因为您的模式规则 $(OBJ_DIR)/%.o: %.cpp 与您的对象列表不匹配。巧合的是,您使用了内置配方使用的变量之一 (CPPFLAGS),但 make 没有使用 INCLUDES.

解决它的一种方法是在您的对象列表之后添加类似下面的内容

OBJS := $(addprefix $(OBJ_DIR)/,$(OBJS))

终于找到问题了。事实上,有两个:

  1. INCLUDES 变量应该设置为 $(CX_SRC_ROOT)/cXbase 而不是 $(CX_SRC_ROOT)/cXbase/publicAPI 因为,如错误消息所示,Player 的包含文件 在 publicAPI/Player.h 中查找,所以 publicAPI 在那里 两次,但没有在 @echo.
  2. 中显示两次
  3. 我的对象列表应该是以下形式:$(OBJ_DIR)/objectFile.o.