c++ - 许多文件夹项目 Makefile
问题描述
我有以下项目结构:
common
|-- foo.cpp
|-- foo.h
exercise_1
|-- main.cpp
|-- bar_1.cpp
|-- bar_1.h
exercise_2
|-- main.cpp
|-- bar_2.cpp
|-- bar_2.h
...
如何组织Makefile
从主目录构建这样的项目,例如:
make exercise_10
因此,此命令将在common
目录、exercise_10
文件夹中构建目标文件并将它们全部链接到exercise_10
. 我从以下内容开始:
COMPILER = g++
INCLUDE = -I common/
DEPS = common/*.o
OBJECTS := $(patsubst common/%.cpp, common/%.o, $(wildcard common/*.cpp))
common: $(OBJECTS)
exercise_%:
$(COMPILER) $@/main.cpp $(INCLUDE) -o $@/main $(DEPS)
但它不起作用,我不知道下一步该做什么。
谢谢!
解决方案
如果您使用 GNU make,您可以定义一个宏来构建您的任何练习。类似于以下内容:
EXERCISES := $(wildcard exercise_*)
MAINS := $(addsuffix /main,$(EXERCISES))
.PHONY: all
all: $(MAINS)
common-objs := $(patsubst %.cpp,%.o,$(wildcard common/*.cpp))
common-headers := $(wildcard common/*.h)
%.o: %.cpp $(common-headers)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -Icommon -c $< -o $@
# $(1): exercise directory
define BUILD_EXERCISE
.PHONY: $(1)
$(1): $(1)/main
$(1)-objs := $$(patsubst %.cpp,%.o,$$(wildcard $(1)/*.cpp))
OBJS += $$($(1)-objs)
$(1)-headers := $$(wildcard $(1)/*.h)
$$($(1)-objs): $$($(1)-headers)
$(1)/main: $$($(1)-objs) $$(common-objs)
$$(CXX) $$(CXXFLAGS) $$(LDFLAGS) -o $$@ $$^ $$(LDLIBS)
endef
$(foreach e,$(EXERCISES),$(eval $(call BUILD_EXERCISE,$(e))))
.PHONY: clean
clean:
rm -f $(MAINS) $(OBJS) $(common-objs)
它看起来有点复杂,但事实并非如此。唯一的技巧是$$
在BUILD_EXERCISE
宏中。它是必需的,因为宏被 make 扩展了两次。其他一切都很简单:
推荐阅读
- python - 使用 pyserial 模块从 PC 到 BLE 设备的多个串口转换问题
- java - OFBiz 中定义的 DataResource 实体在哪里?
- python - 如何用硒填充文本框?
- amazon-web-services - 使用 Terraform 创建/销毁 AWS 账户?
- android - Android Studio HAXM 安装程序错误
- mysql - 如何在 Yii2 中使用 mysql 查询优化器提示?
- c++ - 尝试在媒体基础视频播放器上设置圆形区域时窗口性能不佳
- c - 如何在 C 中使用正则表达式验证字符串时添加 if 语句
- apple-push-notifications - iPad 上的 Microsoft Edge 是否支持推送通知?
- sql - 试图弄清楚为什么 NewID 函数停止在 Oracle 上工作