【问题标题】:How can I get make to put the binaries in a different location?我怎样才能将二进制文件放在不同的位置?
【发布时间】:2011-08-01 13:36:20
【问题描述】:

简短而简单的问题,但我似乎在这里遇到了作家的障碍:

假设我有一个源代码文件与我用来构建程序的 makefile 位于同一目录中:

confus@confusion:~/prog$ ls
binaries  includes  main.c  Makefile

如何将我的main.c 的二进制文件放在binaries 目录中?然后在第二次运行时,make 应该会像平常一样查看那里的二进制文件是否是最新的(并且不要再次编译)。

我的想法是这样的:

# Makefile
.PHONY: all

SOURCES := $(wildcard *.c)
TARGETS := $(subst %.c,binaries/%.o,$(SOURCES))

all:$(TARGETS)

$(TARGETS):$(SOURCES)
    ./compile "$(subst .o,.c,$(@F))" -o "$@"

【问题讨论】:

    标签: directory makefile gnu-make


    【解决方案1】:

    不要说所有的目标都依赖于所有的来源,而是要有一个模式规则

    binaries/%.o: %.c
        ./compile ... -o $@ -c $<
    

    您可能还需要使用 vpath

    修订: 你的subst也有问题...... 该测试有效(仅用于编译单个 .o 文件,您仍然需要链接它们,这是一个非常简单的规则)

    # Makefile
    .PHONY: all
    
    SOURCES := $(wildcard *.c)
    TARGETS := $(patsubst %.c,binaries/%.o,$(SOURCES))
    
    all:$(TARGETS)
    
    binaries/%.o: %.c
        $(CC) -o $@ -c $<
    

    【讨论】:

    • 排除错误:No rule to make target main.o',all'. Stop. 需要
    • 在我们的环境中有些不同,因为在我的环境中,subst 没有做正确的事情......但是你的答案是基于一个工作系统(虽然不使用通配符源选择,它是我的一种做法为了避免)......不过几个小时后我会看看
    • @con-f-use 你在粘贴中显示的是Makefile:10: *** missing separator 这只是意味着你需要用 字符替换前导空格。我不认为 可以从stackoverflow页面正确剪切粘贴(当我将标签粘贴到我的答案中时,我的标签被转换为空格)
    • 非常感谢,但这很奇怪。我的编辑器设置为用空格替换 s。我以前从未遇到过 make 和那个设置的问题。
    • @con-f-use 您的编辑器可能知道不要替换 makefile 中的前导制表符,但是当您粘贴空格时 - 它只能假设您想要它们(空格来自 stackoverflow.com) .
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2023-02-24
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多