我对手工制作的make文件比较新.我已经整理了一个用于构建库的基本make文件.我想将所有临时.o文件保存在构建目录中,并将构建的可执行文件存储在bin目录中.
我的目录结构如下所示:
root
src/
include/
build/
bin/
Makefile
Run Code Online (Sandbox Code Playgroud)
这就是我的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)
Run Code Online (Sandbox Code Playgroud)
.o文件正确放置在构建文件夹中,但它们也出现在根文件夹中(Makefile所在的位置).我该如何解决?
我看到你如何.o在根文件夹中获取object()文件,但我不知道你是如何在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
Run Code Online (Sandbox Code Playgroud)
这是有效的,但粗糙.现在进入目标文件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 $@
debug_build: $(OBJS)
gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core
Run Code Online (Sandbox Code Playgroud)
请注意,对象规则中的命令现在完全相同.所以我们可以通过几种不同的方式将这两个规则结合起来.最简单的是:
build/file1.o: src/file1.c
build/file2.o: src/file2.c
build/file1.o build/file2.o:
gcc -g -fPIC -c $< -I... -o $@
Run Code Online (Sandbox Code Playgroud)
现在又进行了一两次调整,我们很高兴:
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
Run Code Online (Sandbox Code Playgroud)
有更复杂的技巧,但现在应该是充足的.