包含在makefile中找不到的内容

时间:2017-05-13 14:13:27

标签: makefile gnu-make include-path

我一直在研究这个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!

&#34;源文件,标题等中的所有值&#34; section在其他makefile中定义,使用$(MAKE) -C选项从中调用此makefile它们都可以@echo编辑,结果值很好。当我运行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。

你能看出出了什么问题吗?

此致

2 个答案:

答案 0 :(得分:1)

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

解决这个问题的一种方法是在对象列表之后添加如下内容

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

答案 1 :(得分:0)

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

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