【问题标题】:Makefile how to use logical OR between prerequisites?Makefile如何在先决条件之间使用逻辑或?
【发布时间】:2022-01-05 09:31:23
【问题描述】:

我的源文件很好地组织在一个文件夹中,其中包含子文件夹,还包含源文件。
子文件夹不再分支。
所有目标文件都只是被创建并存储在同一个文件夹中。

在编写生成我的目标文件的目标时,我不想在先决条件中手动列出子目录的名称:

现在这可行:

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -c $< -o $@ $(CFLAGS)

$(OBJ)/%.o: $(SRC)/$(subdir1)/%.c
    $(CC) -c $< -o $@ $(CFLAGS)

$(OBJ)/%.o: $(SRC)/$(subdir2)/%.c
    $(CC) -c $< -o $@ $(CFLAGS)

...

但我希望它看起来像这样:

$(OBJ)/%.o: $(SRC)/%.c OR $(SRC)/*/%.c
    $(CC) -c $< -o $@ $(CFLAGS)

我知道标题很可能不是要问的真正问题,但我正在寻找任何解决方案。另外,我知道* 在这里不能用作占位符。

【问题讨论】:

    标签: c gcc makefile gnu-make


    【解决方案1】:

    首先,您可以使用vpath 简化您拥有的makefile:

    $(OBJ)/%.o: %.c
        $(CC) -c $< -o $@ $(CFLAGS)
    
    vpath %.c $(SRC) $(SRC)/$(subdir1) $(SRC)/$(subdir2)
    

    那么,如果你真的不想指定子目录:

    vpath %.c $(shell find $(SRC) -type d)
    

    【讨论】:

    • 如果碰巧有.c 文件同名但源子目录不同,我认为这不会起作用? (虽然,OP的版本也不会)
    • 这很棒。但是,我在 Powershell 中运行 makefile,您是否碰巧知道 shell 命令的 Windows 替代方案? :)
    • @M.M:是的,我想到了。如果发生这样的冲突,那么不仅 OP 的 makefile 将无法工作,甚至没有办法从命令行解决问题。
    • @pluto9800:对不起,我没有。
    • 下载wsl的时间
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2016-08-18
    • 2021-09-20
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多