【问题标题】:Source and Include for MakeFile in CC 中 MakeFile 的源代码和包含
【发布时间】:2021-05-10 15:57:54
【问题描述】:

我正在参加 Coursera 课程,但我完全陷入了其中一个项目中。项目要求我们创建一个 makefile,但我不能。

这是我的文件和文件夹:

project
|---include
    |---CMSIS
        |---cmsis_gcc.h
        |---core_cm4.h
        |---core_cmFunc.h
        |---core_cmInstr.h
        |---ore_cmSimd.h
|------common
        |---memory.h
        |---platform.h
|------msp432
        |---cmsis_gcc.h
        |---msp_compatibility.h
        |---syste_msp432.h
|---src
        |---interr.c
        |---main.c
        |---memory.c
        |---str.h
        |---system_msp.h
|---makefile
|---msp432p401r.lds
|---sources.mk

这是我的 sources.mk 和 makefile。

现在,我只想检查makefile是否成功找到相关源和包含文件,但没有。

我检查了几个示例makefile,但找不到我的错在哪里?我在这里得到的是:

我从错误中了解到的是找不到相关的 memory.h 文件。我能做什么?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 请不要将图片粘贴到 StackOverflow 中。这使我们难以复制,这意味着您的问题不可搜索。相反,请将相关部分剪切并粘贴为文本(使用 StackOverflow 格式化语法正确格式化)。

标签: c gcc makefile


【解决方案1】:

在工作目录中搜索先决条件。它不知道你在别处有memory.h,没有指示不会去找。

解决此问题的一种方法是使用the vpath directive

vpath %.h common

当您在寻找其他先决条件时遇到问题时,您可以使用相同的技巧:

vpath %h common CMSIS
vpath %.c src

这将使echo "HI" 起作用,但是对于实际使用先决条件的真正规则,您将遇到更多麻烦。举一个人为的例子:

memory.o: memory.c memory.h
    $(CC) -c $(CFLAGS) memory.c -o memory.o

这会失败,因为虽然 Make 可以找到先决条件,但 编译器 仍然不知道它们在哪里。

我们通过引用先决条件列表来告诉编译器memory.c 在哪里:

memory.o: memory.c memory.h
    $(CC) -c $(CFLAGS) $< -o memory.o

$&lt; 表示第一个先决条件;Make 将提供路径。)我们可以使用相同的技巧(稍加努力)告诉编译器在哪里搜索头文件,但通常将其放入更简单手工:

memory.o: memory.c memory.h
    $(CC) -c $(CFLAGS) -Icommon $< -o memory.o

【讨论】:

    【解决方案2】:

    重要的是要理解 make 和编译器是两个完全不同的程序,它们做不同的事情并以不同的方式工作。 Make 可以运行一个编译器,但它也可以做各种其他事情:它可以构建文档、整个网站或复制文件等。基本上,make 是一个通用工具,可以调查文件何时过期并运行您给它的任何命令以使该文件“最新”,无论这可能意味着什么。

    所以,当你创建一个像 INCLUDES = -I... 这样的变量时,它会将一个 make 变量设置为一个可以告诉编译器你的头文件在哪里的标志。

    这意味着没有什么可做的。

    Make 看到这条规则:

    ysk: memory.h memory.c
    

    并说“可以构建文件ysk 我需要memory.hmemory.c”。它在当前目录中查找并且这些文件不存在(因为它们在 src/memory.hsrc/memory.c 中)所以它失败了。

    您需要将路径放入您的 makefile 中,以便 make 可以找到它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多