【问题标题】:Makefile rule is not executing in LinuxMakefile 规则未在 Linux 中执行
【发布时间】:2016-06-30 13:34:11
【问题描述】:

我正在尝试在 Linux 和 Mac 中使用 makefile 构建 Atmel BitCloud v3.2 示例应用程序 Blink。在 Windows 中一切正常。但在类似 Posix 的系统中,以下行不起作用:

all: directories images root_files size
$(OBJ_PATH)/%.o: $(SRCS)
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@

因此,没有执行编译器,也没有创建目标文件。结果,链接器会显示错误消息,例如

avr-gcc:错误:All_MegaRf_Atmega256rfr2_8Mhz_Gcc/Obj/blink.o:没有这样的文件或目录

$(OBJ_PATH)/%.o: $(SRCS) 行是问题的根源。

如果我用 $(OBJ_PATH)/blink.o: ../../src/blink.c 之类的东西替换它,则相应的对象文件正在成功创建。

我什至可以通过手动设置构建目标来构建整个应用程序,如下所示:

$(OBJ_PATH)/blink.o: ../../src/blink.c
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@
$(OBJ_PATH)/stdPdsEvents.o: ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsEvents.c
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@

对于项目中的所有 .c 文件。

另一方面,源列表的定义如下:

SRCS = \
 ../../src/blink.c \
 ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsMemAccess.c \
 ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsTimer.c \

谁能帮我弄清楚为什么模式匹配不起作用以及如何恢复它。

注意:类似话题已经打开here,但是作者自己找到的解决方案在我看来没有很好的解释,所以我无法解决我的问题。

【问题讨论】:

  • @MichaëlAzevedo:您最近的编辑似乎删除了语义上重要的空白。请不要用您不熟悉的语言编辑代码。谢谢。
  • @tripleee 我的错,我试图用代码缩进替换背包逃逸。我应该恢复到以前的吗?
  • @MichaëlAzevedo 不需要;我已经恢复了丢失的标签。感谢您如此迅速地做出回应。
  • @tripleee 感谢您的编辑 :)
  • 我不清楚为什么 Makefile 不工作,以及你所说的 POSIX 到底是什么意思。 Makefile 使用 GNU Make 语法扩展,因此显然不适用于 POSIX Make。

标签: linux makefile pattern-matching posix rules


【解决方案1】:

让每个目标文件都依赖于所有源文件然后让编译步骤从源列表中找出实际上有用的文件的结构是相当可疑的。更好的方法是生成 Makefile sn-p 并包含它,如下所示:

makefile.d:
    echo "$(SRCS)" \
    | tr ' ' '\n' \
    | sed -n 's%\(.*\)/\([^/]*\)\.c$$%$(OBJ_PATH)/\2.o: \1/\2.c%p' >$@
include makefile.d

sed 的所有细节都没有正确标准化,所以你最好用 Perl 或其他东西重写替换。这里的重点是我们如何捕获路径和基本名称并为每个依赖项生成特定规则。

【讨论】:

    【解决方案2】:

    终于解决了。 为了使它在 Windows 和 Linux 上都可以编译,应该改变 makefile,如下所示:

    objects := $(patsubst %.c,$(OBJ_PATH)/%.o,$(notdir $(SRCS)))
    $(objects): $(SRCS)
    #$(OBJ_PATH)/%.o: $(SRCS)
        $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@
    

    $(OBJ_PATH)/%.o: $(SRCS) 应被评论或删除。 完成此操作后,可以在 Atmel Studio 6.2 和 Atmel Studio 7 中的 linux 或 mac 和 windows 下构建项目。后者无法像在 linux 或 mac 中一样构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多