【问题标题】:All compiled artifacts in separate directory?所有编译的工件都在单独的目录中?
【发布时间】:2015-11-12 20:49:43
【问题描述】:

我想编写一个简单的 Makefile,它在构建目录中创建所有 *.o*.so 和二进制文件,可能是 build/

在 Makefile 中是否有一种直接的方法来执行此操作?我在 Linux 上,Ubuntu 14.04。

链接的问题将所有 *.o 工件放在构建目录中,但不是可执行文件本身。需要说明的是,我想点击make 并将所有项目编译并存储在build/ 中。

【问题讨论】:

  • 你可以用-o指定一个输出文件,也可以包含一个目录。
  • 有没有办法在我的 Makefile 中设置它,所以如果我只运行make,一切都会按计划进行吗?我只想在某处设置一些默认值,以便所有二进制文件都结束。
  • @jayant 这并不能解决我的问题:我想要所有*.o 文件放在构建目录中的可执行文件。
  • @NaftuliTzviKay 也许我误解了。但在那个问题中,他所有的人工制品都存储在OBJDIR_DEBUG 中,恰好是Debug,你想称之为build。这就是为什么我认为该链接会有所帮助。否则,要回答您的问题,是的,您可以使用 Makefile 将所有构建的工件放在一个单独的目录中。

标签: c makefile


【解决方案1】:

假设您使用 GNU make,类似:

O     ?= build
OBJS  := $(patsubst %.c,$(O)/%.o,$(wildcard *.c))
SOS   := $(O)/<you know better than me>
EXECS := $(O)/<you know better than me>

all: $(OBJS) $(SOS) $(EXECS)

$(OBJS): $(O)/%.o: %.c
    mkdir -p $(O); \
    $(CC) $(CFLAGS) -c $< -o $@

$(SOS): ...

$(EXECS): ...

应该接近你想要的。由于我不知道您要构建哪些*.so 和可执行文件以及如何构建,我只是指出构建*.o 的规则的可能性。应该很容易适应其他目标。

如果您键入make,如果build 子目录不存在,则会创建它。如果您键入make O=foo,则将创建foo 子目录(如果它不存在)并用于代替build

$(OBJS): $(O)/%.o: %.c 是一个静态模式规则。如果还不够清楚,GNU make 文档会告诉你关于它们的一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2014-07-24
    • 1970-01-01
    • 2011-01-04
    • 2015-01-16
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多