在C++中,当你编写了一个头文件(如MyLibrary.h)和对应的实现文件(如MyLibrary.cpp)时,其他源文件(如main.cpp)只需要包含头文件(#include "MyLibrary.h")来访问在头文件中声明的类、函数等。实现文件(MyLibrary.cpp)本身不需要被其他源文件包含。
编译器和链接器负责处理这种分离。当你编译一个包含#include "MyLibrary.h"的源文件时,编译器会处理这个包含指令,将头文件的内容插入到该源文件中,但它不会直接处理实现文件(.cpp)。相反,编译器会为每个.cpp文件生成一个目标文件(在Windows上通常是.obj,在Unix-like系统上通常是.o),这些目标文件包含了该.cpp文件中定义的函数和变量的机器码。
然后,链接器负责将这些目标文件(以及任何库文件)链接成一个可执行文件或库。链接器会查找并解析在目标文件中引用的外部符号(即在其他.cpp文件中定义的函数、变量等)。如果链接器在链接过程中找不到某个引用的符号,它就会报错。
因此,当你在main.cpp中包含MyLibrary.h并使用其中声明的类或函数时,你实际上是在告诉编译器你希望使用这些声明。编译器会确保在main.cpp中正确地引用了这些声明,并生成包含对这些声明引用的机器码的目标文件。然后,链接器会负责找到这些声明的实现(即MyLibrary.cpp中定义的函数和变量),并将它们链接到最终的可执行文件中。
简而言之,你只需要包含头文件,而不需要包含实现文件。编译器和链接器会处理剩下的工作。