Compilation 使用makefile编译具有多个源文件的多个应用程序

Compilation 使用makefile编译具有多个源文件的多个应用程序,compilation,makefile,gnu-make,Compilation,Makefile,Gnu Make,我想用一个makefile编译多个应用程序和多个源文件。 所有源都在一个目录中 应用程序/src/ app1_file1.cpp app1_file2.cpp app1\u main.cpp app2_file1.cpp app2_file2.cpp app2_main.cpp 应用程序/生成文件 生成文件 问题: 我希望将$(\u SOURCES)替换为“app1\u main\u SOURCES,app2\u main\u SOURCES”。 但是上面的代码似乎没有发生这种情况。 有人能建议

我想用一个makefile编译多个应用程序和多个源文件。
所有源都在一个目录中

应用程序/src/
app1_file1.cpp
app1_file2.cpp
app1\u main.cpp
app2_file1.cpp
app2_file2.cpp
app2_main.cpp

应用程序/生成文件

生成文件 问题: 我希望将$(\u SOURCES)替换为“app1\u main\u SOURCES,app2\u main\u SOURCES”。 但是上面的代码似乎没有发生这种情况。 有人能建议使用%的正确方法,用我想要的变量名替换它吗


谢谢

当make解析makefile时,会发生foreach。当你的规则运行的时候,它很早就完成了

此外,您不希望第一个参数中的
$
用于foreach(即,您希望
$(foreach CPP_文件,…,$(CPP_文件)…)

我可能会这样做(未经测试):


也就是说,使用for循环设置应用程序及其对象文件之间的先决条件关系,然后让%规则处理目标->规则映射。

有几种方法可以做到这一点。首先让我们开始工作

编写对象列表与编写源列表一样简单,并且可以节省我们以后的工作:

app1_main_OBJECTS:= app1_file1.o app1_file2.o app1_main.o
app2_main_OBJECTS:= app2_file1.o app2_file2.o app2_main.o

default: app1_main app2_main

app1_main: $(app1_main_OBJECTS)
app2_main: $(app2_main_OBJECTS)

app%_main:
    gcc $^ -o $@
如果有很多应用程序,那么这个应用程序规则列表是多余和乏味的。我们可以减少:

define rule_template
$(1): $$($(1)_OBJECTS)
endef

$(foreach app,app1_main app2_main,$(eval $(call rule_template,$(app))))
或者,如果您的Make版本支持
SECONDEXPANSION
,则更简单:

.SECONDEXPANSION:                
app1_main app2_main: $$($$@_OBJECTS)
通过定义应用程序列表,您可以进一步简化:

APPS := app1_main app2_main

…但这个答案越来越长。

要生成可执行文件(使用%目标),我需要参考应用程序的所有.o文件。如何做到这一点?对目标先决条件使用自动变量。看见
.SECONDEXPANSION:                
app1_main app2_main: $$($$@_OBJECTS)
APPS := app1_main app2_main