2012-01-08 116 views
4

我对手工制作的文件比较新。我已经为构建一个库建立了一个基本的make文件。我想将所有临时.o文件保存在一个构建目录中,并将构建的可执行文件存储在bin目录中。在make文件中指定构建目录

我的目录结构是这样的:

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

虽然我不知道你来自哪里,但在手工制作makefiles之前先试一试'automake'。它以便携式和*用户*可配置的方式支持这种树外构建。 – thiton 2012-01-10 08:19:06

回答

5

我看你是如何获得根文件夹中的对象(.o)文件,但我不知道如何让它们在生成文件夹中。

让我们分阶段。首先我们给对象文件自己的规则:

# 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 [email protected] 

build/file2.o: src/file2.c 
    gcc -g -fPIC -c $< -I... -o [email protected] 

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 [email protected] 

现在,一个或两个小的调整,我们是好去:

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 [email protected] 

debug_build: $(OBJS) 
    gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core 

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

相关问题