包括在 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 中定义它们都可以 @echo
ed 并且结果值是好的.当我 运行 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))
终于找到问题了。事实上,有两个:
INCLUDES
变量应该设置为
$(CX_SRC_ROOT)/cXbase
而不是 $(CX_SRC_ROOT)/cXbase/publicAPI
因为,如错误消息所示,Player
的包含文件
在 publicAPI/Player.h
中查找,所以 publicAPI
在那里
两次,但没有在 @echo
. 中显示两次
- 我的对象列表应该是以下形式:
$(OBJ_DIR)/objectFile.o
.
我已经在这个 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 中定义它们都可以 @echo
ed 并且结果值是好的.当我 运行 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))
终于找到问题了。事实上,有两个:
INCLUDES
变量应该设置为$(CX_SRC_ROOT)/cXbase
而不是$(CX_SRC_ROOT)/cXbase/publicAPI
因为,如错误消息所示,Player
的包含文件 在publicAPI/Player.h
中查找,所以publicAPI
在那里 两次,但没有在@echo
. 中显示两次
- 我的对象列表应该是以下形式:
$(OBJ_DIR)/objectFile.o
.