Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 包含嵌套.h文件的项目的makefile_C_Makefile - Fatal编程技术网

C 包含嵌套.h文件的项目的makefile

C 包含嵌套.h文件的项目的makefile,c,makefile,C,Makefile,假设a1.c和a2.c包括a.h,而a.h本身又包括b.h。因此a1.c和a2.c间接依赖于b.h 现在,如果b.h被修改,我希望makefile编译这两个.c文件。一种方法是将b.h与a.h一起添加到每个规则的依赖项列表中。但我觉得当项目变得越来越大、越来越复杂时,这可能会使事情变得有些复杂。另一种方法是在b.h发生变化时,为touchinga.h添加规则。(我没有试过后者) 处理makefile中嵌套依赖项的最佳方法是什么 我所说的“最佳方式”是指: makefile尽可能紧凑和简单 每个.

假设
a1.c
a2.c
包括
a.h
,而a.h本身又包括
b.h
。因此
a1.c
a2.c
间接依赖于
b.h

现在,如果
b.h
被修改,我希望makefile编译这两个.c文件。一种方法是将
b.h
a.h
一起添加到每个规则的依赖项列表中。但我觉得当项目变得越来越大、越来越复杂时,这可能会使事情变得有些复杂。另一种方法是在
b.h
发生变化时,为
touch
ing
a.h
添加规则。(我没有试过后者)

处理makefile中嵌套依赖项的最佳方法是什么

我所说的“最佳方式”是指:

  • makefile尽可能紧凑和简单

  • 每个.c文件只有在其至少一个相关的.h文件发生更改时才能编译

  • 不依赖于特定编译器或操作系统的功能或工具


  • gcc-MM*.c
    将根据需要输出依赖项

    a1.o: a1.c a.h b.h
    a2.o: a2.c a.h b.h
    
    这又可以作为内置规则(指定CC和CFLAGS宏)按原样使用


    避免在每次更改后手动重新生成Mag文件,考虑使用CGuide和/或IDE。

    gcc-MM*.c
    将根据需要输出依赖项

    a1.o: a1.c a.h b.h
    a2.o: a2.c a.h b.h
    
    这又可以作为内置规则(指定CC和CFLAGS宏)按原样使用


    避免在每次更改后手动重新生成Mag文件,考虑使用CGuide和/或IDE。 三,。从编译器自动生成依赖项信息,并将其包含在Makefile中。可能的重复项(或者您可以跨入21世纪,开始使用带有自动项目管理的IDE,然后专注于编程…)在这种情况下,您需要将编译器指定为Make能够发现源文件的所有头依赖项的唯一方法,除非您手动编写它们(这是不切实际的),否则就是利用编译器的自动依赖项生成功能。@Lundin,makefiles仍然很常见,尽管由GNU Autotools等工具提供动力。从编译器自动生成依赖项信息,并将其包含在Makefile中。可能的重复项(或者您可以跨入21世纪,开始使用带有自动项目管理的IDE,然后专注于编程…)在这种情况下,您需要将编译器指定为Make能够发现源文件的所有头依赖项的唯一方法,除非您手动编写它们(这是不切实际的),否则就是利用编译器的自动依赖项生成功能。@Lundin,makefiles仍然很常见,虽然由GNU Autotools等工具提供动力,但效果良好。但是如果我没有使用GCC呢?我的问题更多的是关于makefile系统自身的能力。@Arham Make在任何意义上都不是C语言处理器。它没有能力像C预处理器那样解析C源文件,它必须这样做才能发现C源文件的头文件依赖关系。换句话说,make是一种工具,它可以获取任何类型的“源”文件,对照“目标”文件检查其时间戳,并在这些文件过期时运行某些命令(“配方”)。就这样,就这样。它是完全通用的,没有特殊的功能来解析任何类型的源代码。但是如果我没有使用GCC呢?我的问题更多的是关于makefile系统自身的能力。@Arham Make在任何意义上都不是C语言处理器。它没有能力像C预处理器那样解析C源文件,它必须这样做才能发现C源文件的头文件依赖关系。换句话说,make是一种工具,它可以获取任何类型的“源”文件,对照“目标”文件检查其时间戳,并在这些文件过期时运行某些命令(“配方”)。就这样,就这样。它是完全通用的,没有解析任何类型源代码的特殊功能。