[英]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.