簡體   English   中英

使用子目錄制作和重新編譯標題

[英]Make and Re-Compiling Headers with Sub-Directories

與我要執行的操作已經存在一些不同的問題,例如thisthisthis 但是,我查看了其中的內容以及它們鏈接到的內容,但仍然無法使它正常工作。

我有以下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) $^

我嘗試的最新操作是刪除dependmakedepend語句,然后將$(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文件不存在的錯誤。

基本上,您需要構造makefile,以便.cpp文件取決於標題。 這樣,對標題的更改將觸發.cpp文件的重新編譯。 為了使此操作更容易,理想情況下,將自動確定每個.cpp文件的標頭依賴關系。

我建議使用GNU自動工具方法(非常適合您將以源代碼形式發布的軟件), 果醬 (非常簡單的配置)或(我目前最喜歡的) CMake 所有這些基本上都是從另一個文件(或文件集)自動生成makefile。 他們也自動處理依賴項檢測和管理。 我只會手動滾動一個makefile文件以進行自我教育,或者只包含少量源文件的東西,或者可能是奇怪而又復雜的東西。

使用-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM