【问题标题】:Specifying build directory in a make file在 make 文件中指定构建目录
【发布时间】:2012-01-08 23:19:58
【问题描述】:

我对手工制作的 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 所在的位置)中。我该如何解决这个问题?

【问题讨论】:

  • 虽然我不知道您来自哪里,但请在手工制作您的 makefile 之前尝试一下automake。它以可移植和用户可配置的方式支持这种树外构建。

标签: gcc makefile


【解决方案1】:

我知道您如何在根文件夹中获取对象 (.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

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

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 2013-01-16
    • 2012-11-20
    • 1970-01-01
    • 2011-05-23
    • 2012-11-28
    相关资源
    最近更新 更多