单个项目的多个Makefile

问题描述 投票:0回答:1

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

enter image description here

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=$@)。除了解决此错误的方法外,我正在寻找一种方法来完成这三件事:

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

2)最后的文件(*.dll*.exe)应放在目录reeleasesrc旁边的目录build中。

3)如果第2项是可能的,则将每种类型的文件放置在release内部的特定目录中(对于bin*.exe,对于lib*.dll,对于其他为shared类型)。同样,即使exe和dll位于不同目录中,也可以从此目录运行可执行文件(使其在../lib中与其他常用位置一起搜索必要的库?)。

makefile mingw gnu-make
1个回答
0
投票

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

Makefile:

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):
        $(MAKE) --directory=$@

$(player): $(libraries)

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.