如何使这个Makefile更加通用?

3
我正在通过完成许多小程序来熟悉C ++,每个程序都包含在一个单独的cpp文件中。我还想学习更多关于Makefile的知识,并决定编写一个Makefile,将编译所有小程序并生成每个程序的可执行文件。使用当前的Makefile,我必须:
  1. 将名称附加到“BINARIES”末尾
  2. 复制重复的目标并将目标名称替换为二进制名称
如何编辑此Makefile以使其更加通用,以便我只需将我的新程序名称附加到“BINARIES”末尾,而不必继续复制和粘贴重复的目标?
    BIN=./bin/
    SOURCE=./src/
    CXX=g++
    CXXFLAGS=-g -c -Wall
    BINARIES=sums-in-loop sum-in-loop sum-of-two
    RM=rm -f

    all: sums-in-loop sum-in-loop sum-of-two

    sums-in-loop:
        $(CXX) $(CXXFLAGS) $(SOURCE)$@.cpp -o $(BIN)$@ 

    sum-in-loop:
        $(CXX) $(CXXFLAGS) $(SOURCE)$@.cpp -o $(BIN)$@ 

    sum-of-two:
        $(CXX) $(CXXFLAGS) $(SOURCE)$@.cpp -o $(BIN)$@ 

    clean:
        $(RM) $(BIN)*

1
@OMGtechy 不是很对。这不是一个“如何让我的代码更好/更快”的问题,他只是在问一个具体方面的问题。不应该移动到代码审查。 - user5458362
CXXRM已经被Make设置为您提供的完全相同的字符串。 - user657267
2个回答

3

通常的方法是使用模式规则:

BIN=bin
SOURCE=src
CXX=g++
CXXFLAGS=-g -Wall
BINARIES=sums-in-loop sum-in-loop sum-of-two
RM=rm -f

all: $(addprefix $(BIN)/,$(BINARIES))

$(BIN)/%: $(SOURCE)/%.cpp
    $(CXX) $(CXXFLAGS) $< -o $@ 

clean:
    $(RM) $(BIN)/*

我收到了“***没有规则可以制作目标'%.c',需要'bin/sums-in-loop'。停止。”的错误信息。有没有办法动态地使目标具有前缀bin/,以满足所需的目标?我正在尝试修改您的解决方案,但还没有成功运行。 - Greg Hilston
1
@Chris关于模式的说法是正确的,但在这个例子中有一些不起作用的地方。SRC应该是SOURCE.c应该是.cpp,而addprefix会从BIN中剥离前导的./,这破坏了模式规则,可以通过声明BIN=bin/而不带前导的./来解决。 - jamieguinan
我还必须从“CXXFLAGS”中删除“-c”,因为我正在制作目标文件,而不是可执行文件。谢谢你们两个! - Greg Hilston
这个 Makefile 违背了 Makefile 的初衷:它总是对可执行文件进行完全重建。而且没有自动生成的头文件依赖关系。 - Maxim Egorushkin
@MaximEgorushkin:它只会重新构建源代码更新的二进制文件。每个二进制文件只能从单个源代码构建,但这似乎是OP想要的。 - Chris Dodd
@MaximEgorushkin 我不认为这违背了Makefile的目的,但可以承认它没有充分利用它们的潜力。我的使用情况是解决小练习问题,每个问题都限制在一个文件中。这就是引起这个问题的原因,无论您是否同意,这是我不知道如何实现的事情,我的谷歌搜索也没有帮助到我。 - Greg Hilston

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接