【发布时间】:2020-07-11 02:09:05
【问题描述】:
我有以下源文件:
% 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 lex.c、lex.o)到obj 文件夹。
我创建了两个文件夹,但我不明白应该如何配置 makefile 文件。
我使用的是 FreeBSD make,所以解决方案越便携越好。
【问题讨论】:
-
您将术语“目录”和“文件夹”混合在一起。在 BSD/Unix/Linux 上,它们是目录,而不是 Windows 用户术语文件夹,这不是一回事。
-
只是说:如果您将自己限制为可移植/标准制作,那么 John Bollinger 在下面的回答是完全正确的:创建隐式规则(POSIX 后缀规则)的唯一可移植方法无法描述以下情况目标位于与控制先决条件不同的目录中。您必须为每个目标编写明确的规则。当然,make 的各种实现都有办法避免这种情况,但是你不再可移植了。