Gcc 在生成文件中指定生成目录
我对手工制作文件比较陌生。我已经建立了一个基本的建库文件。我希望将所有临时.o文件保存在生成目录中,并将生成的可执行文件存储在bin目录中 我的目录结构如下所示: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/
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