首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多文件夹项目Makefile

多文件夹项目Makefile
EN

Stack Overflow用户
提问于 2021-10-01 05:27:29
回答 1查看 78关注 0票数 2

我的项目结构如下:

代码语言:javascript
复制
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从主目录构建这样的项目,例如:

代码语言:javascript
复制
make exercise_10

这样,该命令将在common目录、exercise_10文件夹中构建对象文件,并将它们全部链接到exercise_10中的可执行文件。我从以下几个方面开始:

代码语言:javascript
复制
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)

但这不管用,我不知道下一步该怎么做。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-01 08:38:12

如果您使用GNU,可以定义一个宏来构建您的任何练习。如下所示:

代码语言:javascript
复制
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展开两次的。其他一切都很简单:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69400860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档