【问题标题】:Generic Makefile with automatic make dependencies for multiple executables具有多个可执行文件的自动生成依赖项的通用 Makefile
【发布时间】:2017-04-11 11:06:21
【问题描述】:

这是我想出的或多或少通用的 Makefile。它的作用是检查所有源文件,生成依赖项并创建可执行的 exec(以相应的源文件命名)。显然,每个文件都在一个文件夹中。

CC=gcc
CFLAGS=
LDLIBS=

BIN=exec

SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)

all: makefile.dep $(BIN)

$(BIN): $(OBJ)

makefile.dep: $(SRC)
    gcc -MM $^ > $@

include makefile.dep

.PHONY: all

我想要以某种方式扩展这个 Makefile 来处理 main 的多个定义。我想我要做的就是从 $(OBJ) 中删除所有包含 main 函数的源文件的目标文件,如下所示:

CC=gcc
CFLAGS=
LDLIBS=

BIN=exec
BIN2=toto

SRC=$(wildcard *.c)
JOBS=$(SRC:.c=.o)
JOBS:=$(filter-out $(BIN).o,$(OBJ))
JOBS:=$(filter-out $(BIN2).o,$(OBJ))

all: makefile.dep $(BIN) $(BIN2)

$(BIN): $(OBJ)
$(BIN2): $(OBJ)

makefile.dep: $(SRC)
    gcc -MM $^ > $@

include makefile.dep

.PHONY: all 

虽然它似乎确实有效,但我想知道是否有更优雅的方法可以实现相同的结果,而不必为每个可执行文件复制行。此外,在两个可执行文件的链接步骤中,所有目标文件都被使用,即使是那些不需要的文件(它可能会引入错误?)。

【问题讨论】:

  • 如果您不想明确列出源文件(即没有通配符),那么 make 可能不是正确的工具。查看更新的构建工具,例如 cmake
  • Err... cmake 要求您明确列出源文件;甚至没有通配符的 option 。所以你的评论对我来说没有意义。

标签: c makefile


【解决方案1】:

通常使用wildcard 来查找源文件是一个坏主意。你应该在你的 makefile 中保留一个你想要明确构建的文件的列表。它更不容易出错,而且人们不会经常添加新的源文件,因此更新 makefile 是一件非常麻烦的事情。

你可以使用:

exec_SRC = exec.c foo.c bar.c
toto_SRC = toto.c biz.c baz.c

all: exec toto

exec: $(exec_SRC:.c=.o)
toto: $(toto_SRC:.c=.o)

还有很多其他方法可以做到这一点。这只是一种简单的方法。如果你只有其中的几个,你不妨保持简单。如果你开始有很多它们,可能需要更复杂的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2022-01-25
    • 2023-04-11
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多