首页 > 解决方案 > 使用 Makefile 将不同文件夹中的多个 .cpp 编译到单个 build/ 目录

问题描述

我有以下结构:

当前生成文件:

CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -flto -Ofast
BIN = bin

# Dependency list for each layered tier
DEP_LOGGER = Logger/src/logger.o
DEP_LEXER = Lexer/src/tokens.o Lexer/src/lexer.o

# Nuua dependencies
DEPENDENCIES = nuua.o $(DEP_LOGGER) $(DEP_LEXER)

ifeq ($(OS),Windows_NT)
EXECUTABLE  := nuua.exe
else
EXECUTABLE  := nuua
endif

# Main entry point
all: $(BIN)/$(EXECUTABLE)

# Build the nuua programming language
$(BIN)/$(EXECUTABLE): $(DEPENDENCIES)
    $(CXX) $(CXXFLAGS) -o $@ $^

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm build/*.o

.PHONY: push
push:
    git push
    git subtree push --prefix=Lexer Lexer master
    git subtree push --prefix=Logger Logger master

所以这里的诀窍是:有没有办法让我自动导入Lexer/src/Logger/src/中的所有文件并将所有 .o 编译到 build/ 目录中,而不是与它们各自的 .cpp 文件在同一个文件夹中?当然,我不想单独定义每个 .cpp 和 .o 。如果我决定放置一个新的 .cpp 来自动检测并编译它,我想要自由。

build/目录中的 .o可以与它​​们各自的 .cpp 文件同名。没有 .cpp 将具有相同的名称,即使它们位于不同的文件夹中。

您也可以在这里查看存储库:https ://github.com/nuua-io/Nuua

编辑

我能得到的最接近的是以下解决方案,但需要 build/MODULE 文件夹。

# Configuration
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -flto -Ofast
BIN = bin
BUILD = build

# Dependency list for each layered tier
MODULES = Logger Lexer

# Objects required to build nuua
OBJS = $(BUILD)/nuua.o $(foreach module,$(MODULES),$(patsubst $(module)/src/%.cpp,$(BUILD)/$(module)/%.o,$(wildcard $(module)/src/*.cpp)))

ifeq ($(OS),Windows_NT)
EXECUTABLE  := nuua.exe
else
EXECUTABLE  := nuua
endif

# Main entry point
all: $(BIN)/$(EXECUTABLE)

# Build the nuua programming language
$(BIN)/$(EXECUTABLE): $(OBJS)
    $(CXX) $(CXXFLAGS) -o $@ $^

build/nuua.o: nuua.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@
build/Lexer/%.o: Lexer/src/%.cpp Lexer/include/%.hpp
    $(CXX) $(CXXFLAGS) -c $< -o $@
build/Logger/%.o: Logger/src/%.cpp Logger/include/%.hpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm build/*.o

.PHONY: push
push:
    git push
    git subtree push --prefix=Lexer Lexer master
    git subtree push --prefix=Logger Logger master

标签: c++makefile

解决方案


推荐阅读