我在几个目录中都有源文件,我想将它们编译在一个唯一的临时目录中,目前,我使用此目标来创建目标文件:
wCur := TFDGUIxWaitCursor.Create(nil);
conn := TFDConnection.Create(nil);
try
.....
conn.Connected := True;
conn.ExecSQL('blah blah blah');
conn.Connected := False;
finally
conn.Free();
wCur.Free();
end;
它运行良好,但是当我修改源文件时,不会重新编译对象一个。因此,我必须将源文件添加到依赖项中。
但是此目标无效:
$(BUILD_DIR)/%.o :
@echo "Compiling $@"
$(VERBOSE) $(CC) $(CFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $(shell echo "$(SOURCES)" | sed 's/ /\n/g' | sed -nr '/\/$(*F)\.c/p')
有什么方法可以在依赖项中使用目标名称?
答案 0 :(得分:1)
假设您正在使用GNU Make ...
使用类似以下的规则:
obj/%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
告诉make
要从源文件编译目标文件obj/<name>.o
<name>.c
与此结合使用VPATH
special variable
通知make
应该在其中寻找任何<name>.c
的目录(如果不是)
在当前目录中。
此外,添加一个order-only prerequisite
模式规则,以确保将目标文件编译到的目录(obj
)
在需要时存在:
obj/%.o: %.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
例如,具有项目结构:
./
-- Makefile
-- aa/
-- main.c
-- bb/
-- foo.c
-- obj/ #<-- Compile object files in here
-- prog #<- program to be built
并且:
制作文件
VPATH := aa:bb
SRCS := foo.c main.c
OBJS := $(addprefix obj/, $(SRCS:.c=.o))
.PHONY: all clean
all: prog
prog: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
obj/%.o: %.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
obj:
mkdir $@
clean:
$(RM) $(OBJS) prog
构建过程如下:
$ make
cc -c -o obj/foo.o bb/foo.c
cc -c -o obj/main.o aa/main.c
cc -o prog obj/foo.o obj/main.o