问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Makefile如何自动生成头文件依赖

创作时间:
作者:
@小白创作中心

Makefile如何自动生成头文件依赖

引用
1
来源
1.
https://docs.pingcode.com/ask/300129.html

Makefile可以通过工具如gcc的-M-MM选项、makedepend工具或CMake等自动生成头文件依赖。这些工具会检查源文件并输出头文件的依赖关系,这样在源文件或头文件更新时,只需重新编译影响的部分即可。使用gcc的-M-MM选项时,通常是在Makefile的编译规则中加入这些选项,来生成包含依赖关系的.d文件,并将它们包含进Makefile中。

在实际项目中,通常会对每个源文件产生一个对应的依赖文件(例如.d文件),然后在Makefile中读取这些依赖文件。这样做的好处是,当头文件发生变化时,只有依赖于这些头文件的源文件会被重新编译,从而节省了编译时间。

一、使用GCC产生依赖

基础规则生成:在Makefile中使用gcc的-M-MM-MD-MMD等选项可以自动处理依赖问题。其中-M-MM是生成依赖目标,区别在于-M生成的依赖列表中包括了系统头文件,而-MM只包括用户头文件。-MD-MMD选项与-M-MM类似,但它们会同时编译源文件并生成对象文件。

例如,以下规则可以生成依赖文件和对象文件:

%.o: %.c
    gcc -MMD -c $< -o $@

包含依赖文件:将依赖文件包含到Makefile中可以使用-include指令,它会忽略不存在的依赖文件,避免初次编译时出现错误:

-include $(SOURCES:.c=.d)

在这个例子里,SOURCES变量包含了项目中所有的.c源文件,通过模式替换将它们对应到.d依赖文件,并将这些文件包括到Makefile中。

二、使用makedepend工具

安装makedepend:makedepend是一个独立的工具,通常需要单独安装,它可以直接产生源文件的依赖。

在Makefile中使用:一旦安装了makedepend,可以在Makefile中创建一个特殊的目标,用于生成依赖:

depend: .depend
.depend: $(SOURCES)
    rm -f ./.depend
    makedepend -- $(CFLAGS) -- $(SOURCES)

当执行make depend时,makedepend将为源文件创建依赖关系,并将它们存储在.depend文件中。然后,需要将.depend文件包含进Makefile:

-include .depend

三、使用CMake生成依赖

基本设置:CMake是一个比较现代的构建系统,它可以替代传统的Makefile。CMake可以自动处理依赖关系,并为多种平台生成适当的构建配置。

CMakeLists.txt:在CMakeLists.txt文件中设置项目时,可以使用add_executableadd_library函数来添加源文件,CMake会自动处理头文件的依赖关系。

add_executable(MyExecutable source1.c source2.cpp ...)

CMake会检查指定源文件和相关头文件之间的依赖,并在配置项目时自动生成必要的依赖关系。

四、综合示例和最佳实践

实践示例

SOURCES := $(wildcard *.c)
OBJECTS := $(SOURCES:.c=.o)
DEPS := $(OBJECTS:.o=.d)
-include $(DEPS)
%.o: %.c
    gcc -MMD -c $< -o $@
all: my_program
my_program: $(OBJECTS)
    gcc $^ -o $@
clean:
    rm -f $(OBJECTS) $(DEPS) my_program
.PHONY: all clean

在这个Makefile示例中,首先定义了源文件、对象文件和依赖文件的列表。使用-include指令包含所有的依赖文件。定义了编译规则,使gcc生成依赖文件和对象文件。最后定义了all目标来构建程序,以及clean目标进行清理。

最佳实践

  • 使用-MMD-MP选项而不是-M,这样可以避免系统头文件的依赖,并且-MP选项可以添加虚假的依赖来处理被删除的头文件问题。
  • 将依赖文件和对象文件分开存放,以保持源代码目录的清洁。
  • 对于大型项目,考虑使用CMake或其他构建系统自动管理依赖关系,以简化构建过程并提高跨平台兼容性。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号