c++ - 在 Makefile 先决条件中包含头文件的原因
问题描述
我正在阅读这个制作教程。在这里,他们在先决条件中提到了头文件。这真的有必要吗?我运行没有标题的相同代码并且它有效。例如,我有以下代码
funcs.h
#ifndef FUNCS_H
#define FUNCS_H
int add(int a, int b);
#endif
funcs.cpp
#include "funcs.h"
int add(int a, int b){
return a+b;
}
main.cpp
#include<iostream>
#include "funcs.h"
int main(){
std::cout << add(1,2) << "\n";
}
Makefile
add : main.o funcs.o
g++ -o add main.o funcs.o
main.o : main.cpp funcs.h
g++ -c main.cpp
funcs.o : funcs.cpp funcs.h
g++ -c funcs.cpp
clean :
rm add main.o funcs.o
即使我从funcs.o
和main.o
目标中删除头文件,它仍然有效。那么,还有其他原因为什么要放置头文件吗?
解决方案
makefile 中冒号后面的文件名是目标的依赖项。Make 检查它们,如果任何依赖项比目标更新,则使用下一行的命令重新构建目标。
因此,当然,当您从依赖项中删除头文件时,您仍然可以构建和运行,但如果您只更改头文件中的某些内容,make 将不会正确地重新构建所有目标。
推荐阅读
- java - 如何使用最新的 MobileNet (v3) 进行目标检测?
- protractor - 在量角器中,错误“未创建会话:此版本的 ChromeDriver 仅支持 Chrome 版本 79”
- android - 如何在 Android 中限制特定 Flavor 的暗模式
- c++ - 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- vb.net - MS Access 2016。错误代码“2501”。RunSQL 已取消
- opengl - 使用 opengl VC++ 绘制实时点
- c++ - 在 C++ 中的链表中搜索 NAME
- javascript - 如何根据两个分隔符拆分字符串?
- android - 如何在 ConnectivityManager.NetworkCallback 中使用 onAvailable 方法
- python - Macbook python3 别名是 ephemere