Makefile |对包含在Header文件中的另一个Header文件的依赖关系
Makefile | Dependency on another Header file included in Header file
假设我在Makefile
中有以下规则。
test.o: test.cpp foo.h
g++ -c -o test.o test.cpp
现在假设foo.h
包括bar.h
,如下所示。
user $ head -n 5 foo.h
#include"bar.h"
/*
.
.
*/
user $
如果bar.h
有任何变化,是否会重新构建test.o
?
或者我应该在规则中特别提到bar.h
,如下所示:
test.o: test.cpp foo.h bar.h
g++ -c -o test.o test.cpp
如果
bar.h
有任何变化,是否会重新构建test.o
?
没有。Make无法了解此依赖关系,也无法检查#include
s中的更改。
当然,如果您将处理标头依赖关系留给了解它们的实体:编译器(假设GCC和GNU在本例中成功。)
-
根本不要将标头列为依赖项。
-
生成项目中源文件的列表。
SRCFILES := ...
-
生成依赖文件列表,每个
SRCFILE
一个.d
文件。DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES))
-
将这些依赖文件包含到Makefile中。(领先的
-
意味着如果它们不存在,Make将不会生成错误,例如在第一次编译时。)-include $(DEPFILES)
-
使用通用规则,让编译器在编译每个源文件的过程中生成一个标头依赖项列表。
%.o: %.cpp Makefile @$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@
-MMD
生成Make规则,使对象文件依赖于包含的任何(非系统)头文件,名为*.d
。-MP
添加了伪规则,以避免在从源中删除头文件时出错。
GCC(可能还有Clang)可以为您构建依赖项列表;通过这种方式,您可以简单地从它们的源(cpp)文件制作对象文件:
depend: .depend
.depend: $(SRC_FILES)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ -MF ./.depend;
include .depend
%.o: %.cpp
$(CC) $(CFLAGS) -c $<
您可能还对makedepend
工具感兴趣。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- JavaScript "header"文件来存储一些数据
- Android CMake "致命错误: 'bits/libc-header-start.h' 文件未找到"
- QT C :函数的多个定义当Header文件包含在MainWindow.h中时
- C++在Header文件中包含Header以调用Separated文件类
- Makefile |对包含在Header文件中的另一个Header文件的依赖关系
- 是否可以在C++Header.h文件中放入非(静态构造积分)类型