在make文件中指定构建目录

时间:2012-01-08 12:59:25

标签: gcc makefile

我对手工制作的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所在的文件夹)。我该如何解决这个问题?

1 个答案:

答案 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

还有更复杂的技巧,但现在应该很多。