【问题标题】:Modifying project organization with Makefile使用 Makefile 修改项目组织
【发布时间】:2016-05-23 10:02:15
【问题描述】:

我创建了一个我最初认为很简单的项目(文件很少),但现在该项目正在增长。我正在尝试重新组织目录结构,但我不确定如何修改makefile。

这是我的结构:

root_dir
  Makefile
  main.cc
  fileA.cc
  fileA.h
  fileB.cc
  fileB.h

fileB 也依赖于 fileA (#include "fileA.h"),我的 Makefile 看起来像这样:

all: myExec

myExec: main.o fileA.o fileB.o
     g++ -Wall main.o fileA.o fileB.o -o myExec

main.o: main.cc fileA.h fileB.h
     g++ -Wall -c main.cc

fileA.o: fileA.cc fileA.h
     g++ -Wall -c fileA.cc

fileB.o: fileB.cc fileB.h fileA.h
     g++ -Wall -c fileB.cc

现在我想要这样的东西:

root_dir
  Makefile
  main.cc
  dirA
    fileA.cc
    fileA.h
  dirB
     fileB.cc
     fileB.h

我读到我可以在每个子目录中创建一个 Makefile,但我不确定这在此处是否可行,因为 fileB 依赖于 fileA(位于另一个子目录中)。

或者我应该修改我的主 Makefile 以包含 subdir 吗?

谢谢。

【问题讨论】:

  • 你当前的 Makefile 是如何工作的?
  • 你需要提供一个真实的例子,fileB 如何依赖于fileA?诸如此类的细节至关重要,你甚至没有说你在做什么,可执行文件?图书馆?
  • 我添加了 Makefile 描述。我提到了 fileB 包含 fileA (#include 'fileA.h')。我正在创建一个可执行文件。
  • 不久前,我在西班牙语 SO 上遇到过类似的问题 answered。坦率地说,您不需要明确指定 .h-files 作为依赖项,因为 gcc 可以为您收集这些信息。检查答案(有一个不言而喻的Makefile),也许它对你有帮助。

标签: c++ makefile


【解决方案1】:

如果您坚持使用单个 makefile,它实际上与您已经在做的并没有什么不同,您只需要正确设置包含标志。由于 make 的内置规则,您的 makefile 也可以大大简化,并且使用 GCC 的依赖生成标志,您无需手动添加标头。

注意将 main.cc 更改为 myExec.cc,它更直观的 IMO 并允许您跳过链接配方。

srcs := $(wildcard dirA/*.cc dirB/*.cc)
objs := $(srcs:.cc=.o) myExec.o
deps := $(objs:.o=.d)

CPPFLAGS := -MMD -MP

myExec: CC := $(CXX)
myExec: $(objs)
myExec.o: CPPFLAGS += -IdirA -IdirB
dirA/%.o: CPPFLAGS += -IdirB

.PHONY: clean
clean: ; $(RM) $(objs) $(deps) myExec

-include $(deps)

也就是说,很难看出用这样一个人为的例子将你的项目分成多个目录有什么好处。

【讨论】:

  • 谢谢。但是,我发现您的解决方案不容易阅读。它也很简单,因为它是我给出的一个简单示例,但实际上我有大约 10 个子目录,这会使 makefile 与您的解决方案变得非常复杂,不是吗?
  • 视情况而定无论如何作为包含根并执行#include "dirB/fileB.h 等,这样您在编译时不需要指定单独的包含目录。
  • 听起来不错,谢谢。我将看看您提出的 makefile 解决方案以更好地理解它。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2013-05-23
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多