首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从目录中读取源文件并将对象文件创建到makefile中的另一个文件夹中?

如何从目录中读取源文件并将对象文件创建到makefile中的另一个文件夹中?
EN

Stack Overflow用户
提问于 2020-07-11 02:09:05
回答 1查看 36关注 0票数 0

我有以下源文件:

代码语言:javascript
复制
% ls 
data_lexicon.c  data_lexicon.h  lex.l           makefile

以及以下makefile:

代码语言:javascript
复制
% cat makefile
CC              = cc
CFLAGS          = -Wall -std=c89
LDFLAGS         = -ll
OBJFILES        = lex.o data_lexicon.o
TARGET          = lexical_analyzer_1

all:            $(TARGET) lex.c

lex.c:          lex.l data_lexicon.h
                lex -olex.c lex.l

$(TARGET):      $(OBJFILES)
                $(CC) $(CFLAGS) -o $(TARGET) $(OBJFILES) $(LDFLAGS)

clean:
                rm -f $(OBJFILES) lex.c $(TARGET)

如果我做了make all,我得到:

代码语言:javascript
复制
% ls 
data_lexicon.c          data_lexicon.o          lex.l
lexical_analyzer_1      data_lexicon.h          lex.c
lex.o                   makefile

到目前一切尚好。

但是,我希望将源文件(data_lexicon.c、data_lexicon.h、lex.l)移动到文件夹src中,并将中间文件(data_lexicon.o词汇.c、lex.o)生成到obj文件夹中。

我创建了两个文件夹,但我不明白如何配置makefile文件。

我使用的是FreeBSD make,因此该解决方案的可移植性越强。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-11 04:48:58

但是,

想要将源文件(data_lexicon.c、data_lexicon.h、lex.l)移到文件夹src中,并生成中间文件(data_lexicon.o lev.c、lev.o)到obj文件夹中。

让我惊讶的是,人们为什么坚持为自己做额外的工作。您当然可以做您描述的事情,但是它需要为对象文件编写明确的规则。

但是,首先,您需要了解make本身并不真正了解目录。(无论如何,传统的make并不是这样。和其他一些人可能对它们有一点了解。)也就是说,它对解析文件名的目录没有任何变化的感觉。相反,每个目标名称都是根据make的工作目录解析的。如果您想要引用子目录中的某个内容,那么必须这样说。首先:

代码语言:javascript
复制
OBJFILES        = obj/lex.o obj/data_lexicon.o

规则中的目标和先决条件名称也是如此:

代码语言:javascript
复制
obj/lex.c:      src/lex.l src/data_lexicon.h
                lex -o$@ src/lex.l

这也是支持make的自动变量的原因之一,比如上面规则中的$@表示正在构建的目标的名称。

您的生成文件目前依赖于make的内置规则,用于从相应的C源文件构建对象文件,但“对应”意味着目标和先决条件名称是相同的,包括除后缀(.c vs .o)以外的任何路径组件。您将不再有data_lexicon.o的对应关系,因此您需要为它的构建编写一条明确的规则。这部分是作为练习留下的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62844464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档