【问题标题】:How give subdirectories for C project to include .h file in makefile?如何为 C 项目提供子目录以在 makefile 中包含 .h 文件?
【发布时间】:2021-12-17 19:11:27
【问题描述】:

我有 C 项目,分为 Z 模块。每个模块都有自己的子文件夹,其中 /inc/ 用于头文件,/src/ 用于 src 文件。如图所示:

Zth_Module.c 包含来自其他各种模块的文件:

/*In Zth_Module.c*/
#include "first.h"
#include "second.h"
#include "third.h"

如果在makefile中使用-I,如何给出每个子目录的路径? 它显示致命错误:Timer.h: No such file or directory for include file first.h or second.h which are in other subdirectories.

提供搜索所有 *.h 文件的路径的方法是什么?

【问题讨论】:

  • 是否可以重新组织文件结构,或者拥有软件库(每个目录一个)?请在您的问题中显示您的实际Makefile!据我所知,C 没有模块(但 C++20 或 Ocaml 有)。通过阅读n1570 进行检查。请记住,C 和 C++ 是非常不同的编程语言。对于 C++ 阅读 n3337 或更好。另请阅读编译器的文档,例如GCC
  • GCCninjaGNU makefishQtRefPerSysFLTK等现有开源软件的源代码中获取灵感
  • -I/path/to/inc/of/first -I/path/to/inc/of/second 等等..这样它应该可以工作。

标签: c makefile gnu-make


【解决方案1】:

处理此问题的一些方法是:

  • 在 makefile 中,在每个包含可能包含的头文件的目录的编译标志中包含一个-I <i>directory</i> 开关。 -I 开关告诉编译器搜索以下目录,除了它通常搜索的目录。例如,您可以将开关 -I first/inc -I second/inc -I third/inc 添加到编译标志。您可以在 makefile 中手动列出目录或使用 GNU Make 功能在 make 期间发现它们。
  • 将列出项目根目录的单个-I <i>directory</i> 开关添加到编译开关,并将源代码中的所有#include 指令更改为使用相对于该根目录的路径,例如#include "first/inc/first.h"
  • 创建一个将所有头文件复制到单个公共目录的 makefile 目标,为该目录添加一个 -I <i>directory</i> 开关到编译开关,并将该目标列为每个目标文件的依赖项,以便始终生成在编译源文件之前执行该目标的命令。该目标可以以用于收集头文件的目录命名,并且它通常位于构建的临时区域或暂存区域。此外,如果您有一个 clean 目标,其操作之一可能是删除该目录。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多