Makefile .d 文件的使用

本文介绍了在Makefile中如何管理源文件与头文件间的依赖关系,包括手动设置依赖、利用编译器自动生成依赖以及如何在Makefile中正确引用这些自动生成的依赖文件。

1. 在Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是: 
main.o : main.c defs.h
如果main.c 中包含了很多头文件,那main.o后面要跟N多的.h。你在加入或删除头文件时,也需要小心地修改Makefile。

2. 类似于如下的依赖关系只是建立了.o和.cc之间的依赖关系,那么.cc 改变时.o 会被重新编译。但.cc 中包含的.h改变时并不会影响到.o的重编

%.o: %.cc
 @echo "=======> Compiling $@"
 $(CPP) $(CPPFLAGS) -c -o $@ $<

所以需要建立*.o 和*.h的依赖。但往往*.h非常多,修改起来麻烦。

3. 大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命令: 
    cc -M main.c  其输出是: 
    main.o : main.c defs.h
于是由编译器自动生成的依赖关系,这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。 
 cc -MM UartDev.cc 会在UartDev.d中生成如下内容。

UartDev.o UartDev.d: UartDev.cc ../../common/log.h UartDev.h ../../common/thread.h

从而,当某个.h 文件改变时会引起.o .d的重新编译。

当然还要在Makefile中包含.d文件:

DEPS+= $(SRCS:.cc=.d)

include $(DEPS)

<think>嗯,用户之前问了如何指定Makefile文件,现在又进一步想了解Makefile.am和Makefile.in的区别以及它们的用途。我需要结合之前的回答和用户提供的引用内容来组织答案。 首先,用户的问题分为两个部分:如何在make命令中指定Makefile文件,以及Makefile.am和Makefile.in的区别。关于指定Makefile文件的部分,我之前已经详细回答了,可能需要简要回顾一下,但重点放在区别上。 用户提供的引用提到Makefile.am由程序员编写,automake生成Makefile.in,再由configure脚本生成最终的Makefile。需要明确这三者的关系,以及各自的作用。用户可能在使用automake工具链时遇到困惑,所以需要解释清楚每个文件的用途和生成过程。 要注意用户可能对autotools的工作流程不太熟悉,所以需要用简单的中文解释,避免术语过多。同时,结合之前的回答,强调如何指定自定义名称的Makefile文件,特别是当使用automake生成的情况下,可能需要指定不同的文件。 另外,用户可能在开发中需要手动编写Makefile,或者使用自动生成工具,所以需要区分不同场景下的使用方式。比如,在automake流程中,用户通常不会直接修改Makefile.in,而是通过修改Makefile.am来自动生成。而手动编写的Makefile则不需要这些步骤。 还要注意引用中的内容,比如引用[1]和[2]提到automake生成Makefile.in,configure生成Makefile,引用[3]提到手动编写符合惯例的Makefile的难度。这些内容需要整合到回答中,说明为什么会有这些文件的存在,以及它们如何简化开发流程。 最后,确保回答结构清晰,分点说明,并包含操作示例,帮助用户理解如何在实际中使用这些文件。可能还需要提到常见错误,比如在automake流程中直接修改Makefile.in导致的问题,提醒用户正确的工作流程。</think>#### **一、指定Makefile文件的完整方法** 当使用非默认名称的Makefile时,必须通过 `-f` 参数显式指定文件。以下是具体场景及验证方法: --- ##### **1. 基础语法** ```bash make -f <自定义文件名> [目标] -j$(nproc) ``` - **示例**: ```bash make -f Buildfile clean # 执行清理操作 make -f Buildfile install -j8 # 带并行编译的安装 ``` ##### **2. 路径处理** - **相对路径**: ```bash make -f ./build/debug.mk ``` - **绝对路径**: ```bash make -f /opt/project/config/arm64.mk ``` ##### **3. 动态验证** 通过 `ls` 和 `file` 命令验证文件有效性: ```bash ls -l Buildfile && file Buildfile # 确认文件存在且为文本文件 ``` --- #### **二、Makefile.am与Makefile.in的核心区别** 通过Autotools工具链(automake/autoconf)的生成流程理解二者关系: ##### **1. 文件角色对比表** | **文件类型** | **创建者** | **修改权限** | **典型内容** | **生命周期阶段** | |------------------|---------------|--------------|----------------------------------|---------------------| | `Makefile.am` | 开发者手动编写 | 可编辑 | 声明目标、源码、编译选项 | 项目初始化阶段 | | `Makefile.in` | automake生成 | 禁止直接修改 | 含`@VARIABLE@`的模板 | `./configure`执行前 | | `Makefile` | configure生成 | 自动生成 | 替换变量后的完整编译指令 | 构建阶段 | ##### **2. 生成流程详解** ```mermaid graph TD A[Makefile.am] -->|automake| B(Makefile.in) B -->|configure脚本| C(Makefile) C -->|make命令| D[可执行文件] ``` - **关键过程**: 1. 开发者编写 `Makefile.am`,定义如: ```makefile bin_PROGRAMS = hello hello_SOURCES = main.c utils.c ``` 2. 运行 `automake --add-missing` 生成 `Makefile.in`(包含平台相关占位符) 3. `./configure` 扫描系统环境,将 `Makefile.in` 中的 `@CC@`、`@CFLAGS@` 替换为实际值,输出最终 `Makefile` ##### **3. 文件内容差异示例** - **Makefile.am**(开发者维护): ```makefile ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src lib ``` - **Makefile.in**(自动生成): ```makefile CC = @CC@ CFLAGS = @CFLAGS@ all: $(SUBDIRS) ``` --- #### **三、Autotools工具链最佳实践** ##### **1. 开发环境配置** ```bash # 安装必要工具 sudo apt-get install automake autoconf libtool # 初始化项目 autoscan && mv configure.scan configure.ac aclocal autoheader automake --add-missing autoconf ``` ##### **2. 常见问题排查** - **错误**:`missing automake-1.16` - **解决方案**: ```bash autoreconf --install # 自动修复工具链版本 ``` - **错误**:`undefined reference to 'function_name'` - **根源**:`Makefile.am` 中缺少库链接声明 - **修正**: ```makefile hello_LDADD = -lmylib # 添加链接库 ``` --- #### **四、手动编写 vs 自动生成的抉择** | **场景** | **推荐方案** | **优势** | |------------------------|--------------------|-----------------------------------| | 小型单文件项目 | 手动编写Makefile | 简单直接,无需复杂配置 | | 跨平台C/C++项目 | 使用Autotools | 自动处理编译器差异和依赖检测 | | 需要打包RPM/DEB | 必须用Autotools | 符合Linux发行版打包规范[^1] | | 嵌入式系统交叉编译 | CMake+Autotools组合| 兼顾灵活性和自动化(引用[3]) | --- #### **五、引用说明** - **Makefile.in的模板作用**:允许configure阶段动态插入系统特定参数(如编译器路径)[^1] - **automake --add-missing**:自动补全缺失的标准文件(如`INSTALL`、`COPYING`)[^2] - **跨平台构建**:Autotools可自动检测POSIX兼容性问题和硬件特性(引用[3])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值