繁体   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