[英]Make and Re-Compiling Headers with Sub-Directories
与我要执行的操作已经存在一些不同的问题,例如this , this和this 。 但是,我查看了其中的内容以及它们链接到的内容,但仍然无法使它正常工作。
我有以下make文件(我在这里有了一些帮助)。 它从源目录中的.cpps在生成目录中生成.os。 我想对此进行调整,以便如果更新标头,则可以正确地重新编译标头,因此我不必make clean
整件事(尤其是INC_DIR1
文件夹中的标头)。
CC = g++
CFLAGS = -g -Wall
INC_DIR1 = include
INC_DIR2 = C:/CPPFiles/CPP_Extra_Libraries/armadillo-4.200.0/include
INC_DIR = $(INC_DIR1) $(INC_DIR2)
INCLUDES = $(foreach d, $(INC_DIR), -I$d)
BUILD_DIR = build
SRC_DIR = test
SRC = $(wildcard */*.cpp)
VPATH = $(SRC_DIR)
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(SRC:.cpp=.o)))
MAIN = armadillo_extra_functions_test
.PHONY: depend clean
all: $(BUILD_DIR) $(MAIN)
@echo compilation complete
$(BUILD_DIR):
mkdir -p $@
$(BUILD_DIR)/%.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
$(MAIN): $(OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS)
clean:
$(RM) *.o *~ $(MAIN) $(BUILD_DIR)/*.o
depend: $(SRC)
makedepend $(INCLUDES) $^
我尝试的最新操作是删除depend
和makedepend
语句,然后将$(BUILD_DIR/%.o: %.cpp
语句替换为
DEPS = $(patsubst %.o, %.d, $(OBJS))
-include $(DEPS)
$(BUILD_DIR)/%.o: %.cpp
$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@
$(CC) -c $(CFLAGS) -MMD $< > $(DEPS)
没有这些调整的最后一行,make文件将运行,尽管它不会更新标题。 但是,当我在最后一行添加内容时,出现有关$(BUILD_DIR)/%.d
文件不存在的错误。
使用-MMD
标志几乎是正确的,但无需使事情复杂化:
INC_DIR1 := include
INC_DIR2 := C:/CPPFiles/CPP_Extra_Libraries/armadillo-4.200.0/include
INC_DIRS := $(INC_DIR1) $(INC_DIR2)
BUILD_DIR := build
SRC_DIR := test
SRCS := $(wildcard $(SRC_DIR)/*.cpp)
OBJS := $(SRCS:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:.o=.d)
LDLIBS := # -l flags
LDFLAGS := # -L flags
CPPFLAGS := -MMD -MP $(foreach DIR, $(INC_DIRS), -I $(DIR))
CXXFLAGS := -W -Wall
MAIN := armadillo_extra_functions_test
.PHONY: all clean
all: $(MAIN)
@echo "compilation complete"
$(MAIN): $(OBJS)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
clean:
$(RM) -r $(MAIN) $(BUILD_DIR)
-include $(DEPS)
$(BUILD_DIR):
mkdir $@
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp | $(BUILD_DIR)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
一些快速注意事项:
您正在使用C ++。 删除其C ++版本的$(CC)
和$(CFLAGS)
C变量: $(CXX)
和$(CXXFLAGS)
变量。
$(CPPFLAGS)
用于预处理器标志,例如-MMD
, -MP
或-I
。
您需要包括在依赖文件中创建的GCC规则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.