我对手工制作的make文件相对较新。我已经整理了一个用于构建库的基本make文件。我想将所有临时的.o文件保存在构建目录中,并将构建的可执行文件存储在bin目录中。
我的目录结构如下所示:
root
src/
include/
build/
bin/
Makefile
这就是我的make文件:
SHLIB = pg_extlib
SRC = src/file1.c \
src/file2.c
OBJS = build/file1.o \
build/file2.o
debug_build:
gcc -g -fPIC -c $(SRC) -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude
gcc -shared -o bin/$(SHLIB).so $(OBJS) -lm -lpq -lmylib_core
clean:
rm -f $(SHLIB) $(OBJS)
.o文件正确放置在build文件夹中,但它们也出现在根文件夹中(Makefile所在的文件夹)。我该如何解决这个问题?
答案 0 :(得分:5)
我看到你如何在根文件夹中获取对象(.o
),但我不知道你是如何在build文件夹中获取它们的。
让我们分阶段进行。首先,我们将为目标文件提供自己的规则:
# Note the use of "-o ..."
build/file1.o:
gcc -g -fPIC -c src/file1.c -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o build/file1.o
build/file2.o:
gcc -g -fPIC -c src/file2.c -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o build/file2.o
debug_build: $(OBJS)
gcc -shared -o bin/$(SHLIB).so $(OBJS) -lm -lpq -lmylib_core
这是有效的,但粗糙。目标文件现在进入build/
,但是有很多冗余,没有依赖项处理。所以我们提出了先决条件,假设你正在使用GNUMake(你应该使用),我们可以使用Automatic Variables(为了便于阅读,我将缩写-I字符串):
build/file1.o: src/file1.c
gcc -g -fPIC -c $< -I... -o $@
build/file2.o: src/file2.c
gcc -g -fPIC -c $< -I... -o $@
debug_build: $(OBJS)
gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core
请注意,对象规则中的命令现在完全相同。所以我们可以通过几种不同的方式将这两个规则结合起来。最简单的是:
build/file1.o: src/file1.c
build/file2.o: src/file2.c
build/file1.o build/file2.o:
gcc -g -fPIC -c $< -I... -o $@
现在又进行了一两次调整,我们很高兴:
build/file1.o: src/file1.c
build/file2.o: src/file2.c
build/file1.o build/file2.o:
gcc -g -fPIC -c $< -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o $@
debug_build: $(OBJS)
gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core
还有更复杂的技巧,但现在应该很多。