【问题标题】:multiple Makefile for a single project单个项目的多个 Makefile
【发布时间】:2020-04-25 02:01:56
【问题描述】:

我正在尝试构建一个包含多个模块的项目。文件树如下所示:

lib_one、lib_two 和 Main.cpp 的各个 Makefile 工作正常,为项目生成 2 个 DLL 和 EXE,但需要进入每个目录并为每个模块执行命令“make”。

我现在想要一个位于顶级目录 ('/project') 中的 Makefile,它会触发所有其他模块(DLL 和 EXE)的构建一次。根据一些搜索结果,我得到了类似的结果:

lib_one := ./src/lib_one
lib_two := ./src/lib_two
libraries := $(lib_one) $(lib_two)
player    := ./src

.PHONY: all $(player) $(libraries)
all: $(player)

$(player) $(libraries):
        $(MAKE) --directory=$@

$(player): $(libraries)

当我执行命令“make”时,我得到了这个错误:

Makefile:10: ***.  Stop.

(第 10 行是这一行:$(MAKE) --directory=$@)。除了解决此错误的方法外,我还在寻找一种方法来完成这 3 件事:

1) 所有模块(DLL 和 EXE)的目标文件 (*.o) 应存储在目录 build 与目录 src 相同的位置。

2) 最终文件(*.dll*.exe)应放置在目录 reelease 旁边的目录 srcbuild 中。

3) 如果第 2 项是可能的,最好将每种类型的文件放在 release 内的特定目录中(bin 用于 *.exelib 用于 *.dllshared 用于其他类型)。此外,即使 exe 和 dll 在不同的目录中,也可以从该目录运行可执行文件(使其在 ../lib 以及其他常用位置搜索必要的库?)。

【问题讨论】:

标签: makefile mingw gnu-make


【解决方案1】:

@Maxim 很可能是错误的原因——空格与制表符。至于您的其他问题,如果不使用非递归 make,您可以执行以下操作:

生成文件:

export base_dir := ${CURDIR}
export obj_dir := ${base_dir}/build
export release_dir := ${base_dir}/release   

lib_one := ${base_dir}/src/lib_one
lib_two := ${base_dir}/src/lib_two
libraries := $(lib_one) $(lib_two)
player    := ${base_dir}/src

.PHONY: all $(player) $(libraries)
all: $(player)

$(player) $(libraries): | ${obj_dir} ${release_dir}
        $(MAKE) --directory=$@

$(player): $(libraries)

${obj_dir} ${release_dir} :
        @mkdir -f $@

子 makefile 可以访问从父级导出的任何变量(请参阅 here),因此您可以在这些文件中执行以下操作:

${obj_dir}/%.o : %.c
       @echo  compiling "$^ ==> $@"
       $(CC) -c -o $@ $^ $(CFLAGS)

这会将对象编译到正确的目录。

但请注意 - 如果您有两个组件生成同名的目标文件,因为它们是在同一个目录中生成的,您最终可能会遇到难以调试的竞争条件。通常,每个组件都会在其自己的唯一目录中生成目标文件以避免这种情况。

【讨论】:

  • 好的,我认为这会起作用,但现在它不会创建目录 buildrelease(如果不存在)。是否可以自动执行此操作?
  • $(player) $(libraries): | ${obj_dir} ${release_dir}(请注意,这些必须是order-only 先决条件)。然后做${obj_dir} ${release_dir}: ; mkdir -f $@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多