【问题标题】:Gnu make with 2 source-files directoriesGnu make 带有 2 个源文件目录
【发布时间】:2021-07-23 02:49:52
【问题描述】:

我正在尝试用 gnu make 编译一个 c 程序,以便将创建的目标文件放在 Build 目录中。我的项目目录如下所示:

| root
|--> makefile
|--> BuildDir
|--> HeadersDir
|    -> main.h
|    .
|    .
|--> Modules
|    -> modules1.c
|    .
|    .
|--> Program
|    -> program1.c
|    .
|    .

我希望从模块和程序源文件创建的所有目标文件都保存在 BuildDir 中。到目前为止我有这个makefile

CC = gcc
CFLAGS = -Wall -Wextra -g3 -I./HeaderFiles
LDFLAGS = -lm

# Get all source files
SRCFILES := $(wildcard ./Programs/*.c)
SRCFILES += $(wildcard ./Modules/*.c)

# Generate objective files
OBJFILES = $(patsubst %.c, %.o, $(SRCFILES))
OBJFILES := $(subst ./Programs, ./Build, $(OBJFILES))
OBJFILES := $(subst ./Modules, ./Build, $(OBJFILES))

EXEC = travelMonitor
PARAMETERS =

all: $(OBJFILES) $(EXEC)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

$(EXEC): $(OBJFILES)
    $(CC) $(CFLAGS) $(OBJFILES) -o $@

然后输出:

make: *** No rule to make target 'Build/mainFunctions.o', needed by 'all'.  Stop.

谁能帮忙?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这条规则:

    %.o: %.c
    

    说明如何从.c 构建.o。仅当目标与模式都匹配并且先决条件存在或可以构建时,该规则才能匹配。那么这条规则符合吗?

    嗯,对于目标Build/mainFunctions.o,它确实匹配模式,带有Build/mainFunctions 的词干(匹配% 的部分)。鉴于这个词根,先决条件是什么?我们有%.c,所以在替换了主干后,我们想要构建先决条件Build/mainFunctions.c。那存在吗?不。 make 知道如何制作吗?不,因此,此模式规则不匹配。 Make 将寻找任何可能匹配的 other 模式规则,但没有。所以,make 告诉你它找不到任何方法来创建这个目标。

    如果您想将目标文件放在不同的目录中,那么您必须将其编码到您的规则中,否则 make 无法知道使用哪个规则;你必须这样写:

    Build/%.o : Programs/%.c
            $(CC) $(CFLAGS) -c $< -o $@
    

    当然,这不会构建模块源,因此您需要另一个规则:

    Build/%.o : Modules/%.c
            $(CC) $(CFLAGS) -c $< -o $@
    

    现在它可以工作了。

    【讨论】:

    • 这确实有效。非常感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多