我对.cpp文件的Makefile依赖项有些困惑。例如,假设我有一个文件main.cpp,其中包含Point.h和Rectangle.h。我认为main.o的Makefile依赖项行看起来像:
main.o:main.cpp
但是似乎大多数人会这样做:
main.o:main.cpp Point.h Rectangle.h
我不明白为什么。在链接之前创建对象文件,对吗?因此,当将main.cpp编译为main.o时,在某种程度上,它对Point和Rectangle函数的引用仍然是未解析的引用。然后,当使最终可执行文件时,链接程序将使用Point和Rectangle的机器代码解析引用。换句话说,如果我更改Point.h或Rectangle.h,main.o并不会真正受到影响。最终的可执行文件确实依赖于这三个文件,但main.o则不。我的想法出了什么问题?
假设您的Point.h
头文件按如下所示定义了一个类:
class Point {
int x;
int y;
int hash() const
{
return x+y;
}
};
该类中可能包含其他内容,或某些其他类方法。这只是一个例子。
您的main.cpp
调用某些hash()
的Point
方法。然后编译。
现在返回,然后编辑此头文件:
int hash() const
{
return x*y;
}
您在main.cpp
中没有任何更改。
但是您显然必须重新编译它,因为它现在应该做不同的事情,因为它调用了hash()
。
[任何头文件中的大部分更改可能会影响包含该文件的任何.cpp
文件,因此都必须重新编译它们。
#include
在逻辑上等同于用#include
将行替换为包含文件的全部内容。
因此,如果更改头文件中的任何内容,从逻辑上讲等效于更改包含它的.cpp
文件中的任何内容。