Gcc 在生成文件中指定生成目录

Gcc 在生成文件中指定生成目录,gcc,makefile,Gcc,Makefile,我对手工制作文件比较陌生。我已经建立了一个基本的建库文件。我希望将所有临时.o文件保存在生成目录中,并将生成的可执行文件存储在bin目录中 我的目录结构如下所示: root src/ include/ build/ bin/ Makefile 这就是我的make文件的外观: SHLIB = pg_extlib SRC = src/file1.c \ src/file2.c OBJS = build/file1.o \ build/

我对手工制作文件比较陌生。我已经建立了一个基本的建库文件。我希望将所有临时.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所在的位置)中。如何修复此问题?

我看到您如何在根文件夹中获取对象(
.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(您应该这样做),我们可以使用(为了可读性,我将缩写-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$@
调试生成:$(OBJS)
gcc-shared-obin/$(SHLIB).so$^-lm-lpq-lmylib_核心
请注意,对象规则中的命令现在完全相同。因此,我们可以通过两种不同的方式将这两条规则结合起来。最简单的是:

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-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
build/file1.o:src/file1.c
build/file2.o:src/file2.c
build/file1.o build/file2.o:
gcc-g-fPIC-c$<-I`pg\u配置--includedir`-I`pg\u配置--includedir服务器`-I/some/required/path/include-Iinclude-o$@
调试生成:$(OBJS)
gcc-shared-obin/$(SHLIB).so$^-lm-lpq-lmylib_核心

还有更复杂的技巧,但现在应该已经足够了。

虽然我不知道你是从哪里来的,但在手工制作制作文件之前,请尝试一下
automake
。它以可移植且用户可配置的方式支持这种树外构建。相关:
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