【问题标题】:How do I get a makefile to compile multiple sources?如何获得一个 makefile 来编译多个源?
【发布时间】:2021-04-09 10:31:26
【问题描述】:

我希望我的 makefile 编译两个源,osmprun.c 和 echoall.c。 目前它只是在编译 osmprun.c,这会产生错误。

我束手无策,我根本没有使用 makefile 的经验,我只是不明白我做错了什么。

我的makefile是:

CC=gcc
CFLAGS= -Wall -Wconversion -g 
LIBS=-lm -lpthread
DEPS=

BUILD_DIR := build

SRCS := osmprun.c echoall.c
OBJS := $(addprefix $(BUILD_DIR)/,$(patsubst %.c,%.o,$(SRCS)))

$(BUILD_DIR)/%.o: %.c $(DEPS)
    mkdir -p $(BUILD_DIR)
    $(CC) -c $(CFLAGS) $< -o $@


echoall: $(OBJS)
    mkdir -p $(BUILD_DIR)
    $(CC) $(CFLAGS)  $< $(LIBS) -o $@

osmprun: $(OBJS)
    mkdir -p $(BUILD_DIR)
    $(CC) $(CFLAGS)  $< $(LIBS) -o $@



.PHONY: clean

clean:
    rm -f $(BUILD_DIR)/*.o *~ core

test:
    ./osmprun

有人可以帮我找出我的错误并解释问题所在吗?

编辑:

我现在已经将应该编译这两个文件的部分更改为:

echoall: echoall.c 
    $(CC) $(CFLAGS)  $^ $(LIBS) -o $@

osmprun: osmprun.c
    $(CC) $(CFLAGS)  $^ $(LIBS) -o $@

但它仍然只是编译 echoall,而不是 osmprun

【问题讨论】:

  • 不要在多个食谱中使用mkdir。在不同的规则中创建目录并添加依赖项。

标签: c makefile


【解决方案1】:

如果你把你输入的命令和你得到的输出,以及你想要得到的东西包括在内,这将有很大帮助,特别是因为你的术语不太准确。 make 没有编译所有目标文件是不正确的。问题出在链接阶段。

但是,我不明白您的 makefile 打算做什么。您有两个目标,它们都依赖于相同的目标文件集:

echoall: $(OBJS)

osmprun: $(OBJS)

您需要将这两个目标文件链接在一起吗?如果是这样,那么echoall 程序和osmprun 程序之间有什么区别,如果它们都包含相同的目标文件集?

或者,您想从echoall.c 源文件创建echoall 程序并从osmprun.c 源文件创建osmprun 程序吗?如果是这样,您为什么将这两个对象都列为两个程序的先决条件?

无论如何你的问题都在这里:

echoall: $(OBJS)
        mkdir -p $(BUILD_DIR)
        $(CC) $(CFLAGS)  $< $(LIBS) -o $@

osmprun: $(OBJS)
        mkdir -p $(BUILD_DIR)
        $(CC) $(CFLAGS)  $< $(LIBS) -o $@

(这里的mkdir 没用:您知道该目录已经存在,因为您已经构建了目标文件,但它们不会造成任何伤害)。

问题是您使用的是$&lt;,这是第一个先决条件。因为两个先决条件列表是相同的,所以您从同一个源文件构建这两个程序。

如果您希望两个程序都包含两个目标文件,您应该在这里使用$^ 而不是$&lt;。如果您希望每个程序仅包含其相关的目标文件,则应将先决条件更改为仅包含应从其构建的目标文件(并使用$^)。

【讨论】:

  • 谢谢!我听从了你的建议并编辑了文件,但它仍然只编译最上面的一个源文件然后停止
  • make 默认只构建文件中的第一个目标。如果你想构建一个不同的目标,你可以在命令行上请求它,比如make foo 来构建foo。如果您希望默认行为是构建多个文件,那么您可以使 makefile 中的第一个目标默认列出您想要的所有文件作为先决条件;例如,您可以添加all: echoall osmprun 作为makefile 中的第一个目标。在这种情况下,您可能需要添加 .PHONY: all 以告知 all 不代表真实文件,它只是一个内部目标。
  • 这正是我想做的,非常感谢!你是救生员
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多