c++ - 使用 Makefile 将不同文件夹中的多个 .cpp 编译到单个 build/ 目录
问题描述
我有以下结构:
- bin/(这是最终可执行文件所在的位置)
- build/(这是我希望 .o 文件所在的位置)
- 词法分析器/
- src/(这是 lexer .cpp 文件所在的位置,也是生成 lexer 的 .o 的位置)
- 记录仪/
- src/(这是记录器 .cpp 文件所在的位置以及生成记录器的 .o 的位置)
- main.cpp(它包含主要功能 + 来自 Lexer 和 Logger 的包含)
- 生成文件
当前生成文件:
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
解决方案
推荐阅读
- gradle - Gradle 自定义任务扩展 Exec 抛出错误
- firebase - 将文本定位在右上角?
- jquery - 如何更改删除确认消息标题 kendo jQuery 网格?
- java - 当我尝试实现 Parcelable 接口时出错
- javascript - 如何在映射后抛出数组并在 if else 条件后重新运行新数组
- angular - 角度测试:按钮单击时的输出发射器为 dispatchEvent 返回 null
- c++ - 为什么在这里通过引用传递指针会导致错误?
- javascript - 比较数组和更改数组元素名称Javascript
- wordpress - 从 wordpress 网站导出和导入数据到另一个 wordpress 网站不起作用
- java - Spring:JUnit 测试休息控制器