gpt4 book ai didi

gcc - 在 make 文件中指定构建目录

转载 作者:行者123 更新时间:2023-12-03 04:48:07 25 4
gpt4 key购买 nike

我对手工制作的 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 文件正确放置在构建文件夹中,但它们也出现在根文件夹(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(您应该这样做),我们可以使用 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

还有更复杂的技巧,但目前应该足够了。

关于gcc - 在 make 文件中指定构建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com