我有以下源文件:
% ls
data_lexicon.c data_lexicon.h lex.l makefile以及以下makefile:
% 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,我得到:
% 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,因此该解决方案的可移植性越强。
发布于 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的工作目录解析的。如果您想要引用子目录中的某个内容,那么必须这样说。首先:
OBJFILES = obj/lex.o obj/data_lexicon.o规则中的目标和先决条件名称也是如此:
obj/lex.c: src/lex.l src/data_lexicon.h
lex -o$@ src/lex.l这也是支持make的自动变量的原因之一,比如上面规则中的$@表示正在构建的目标的名称。
您的生成文件目前依赖于make的内置规则,用于从相应的C源文件构建对象文件,但“对应”意味着目标和先决条件名称是相同的,包括除后缀(.c vs .o)以外的任何路径组件。您将不再有data_lexicon.o的对应关系,因此您需要为它的构建编写一条明确的规则。这部分是作为练习留下的。
https://stackoverflow.com/questions/62844464
复制相似问题