【问题标题】:Compile multiple applications with multiple source files using makefile使用 makefile 编译具有多个源文件的多个应用程序
【发布时间】:2013-07-31 01:55:29
【问题描述】:

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

应用程序/src/
app1_file1.cpp
app1_file2.cpp
app1_main.cpp
app2_file1.cpp
app2_file2.cpp
app2_main.cpp

应用程序/Makefile

生成文件

APPS:= app1_main app2_main  
app1_main_SOURCES:= app1_file1.cpp app1_file2.cpp app1_main.cpp
app2_main_SOURCES:= app2_file1.cpp app2_file2.cpp app2_main.cpp

default: app1_main app2_main

%: $(foreach $CPP_FILE,$(%_SOURCES),$(patsubst %.cpp,%.o,$(CPP_FILE)))
     gcc ....
%.o: src/%.cpp
     gcc ...

问题

我希望将 $(%_SOURCES) 替换为“app1_main_SOURCES,app2_main_SOURCES”。 但这似乎并没有发生在上面的代码中。 有人可以建议使用 % 的正确方法将其替换为我想要的变量名。

谢谢

【问题讨论】:

    标签: compilation makefile gnu-make


    【解决方案1】:

    foreach 在 make 解析 makefile 时发生。在您的规则运行时,它已经完成了很长时间。

    此外,您不希望在 foreach 的第一个参数中使用 $(即您希望 $(foreach CPP_FILE,...,... $(CPP_FILE) ...))。

    我可能会做类似(未经测试)的事情:

    $(foreach APP,$(APPS),$(APP): $(addprefix src/,$($(APP)_SOURCES:.cpp=.o)))
    
    %:
            gcc ...
    %.o: src/%.cpp
            gcc ...
    

    即使用for循环建立应用程序及其目标文件之间的先决关系,然后让%规则处理目标->规则映射。

    【讨论】:

    • 要生成可执行文件(使用 % 目标),我需要引用应用程序的所有 .o 文件。我该怎么做?
    • 对目标先决条件使用自动变量。见the make documentation
    【解决方案2】:

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

    编写一个objects列表就像编写一个sources列表一样容易,并且可以节省我们以后的工作:

    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
    

    ...但是这个答案越来越长了。

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多