用makefile 编译C++程序的时候,我写makefile时有这样的感受。编写过程中我的一个.o依赖于一个.cpp文件,.cpp文件所对应的.h文件中引用了其他 手工编写的.h文件.这时按照makefile的编写规则,我们是需要依赖于这样的.h文件。理由是:我们每一个.cpp文件是一个编译单元,对于这样一 个编译单元,我们依赖于一些声明。记住我们都只是依赖于一些声明,当这些声明发生变化时,我们必须认为他依赖的文件已经发生了改变。我们有必要对其进行重 新编译。其实际上我们可以这样认为,只有.cpp才能编译,.h最后都载入到了cpp中。也就是说.h的文件和.cpp的文件最终都参与了编译,最终 的.h文件都是一些变量的定义和声明。我们的编译器首先把.h文件中的全部读入到.cpp中,然后进行编译,这时是按照编译单元来编译的,就是保证每一个 单元都能正常编译通过。我们编译的时候要建立一个库用来记录每一个所有变量的定义,到时候要进行链接。我们先从main文件开始慢慢进行链接只要是函数地 址我们就用函数编译后的相对地址,如果是变量,我们当然要换成变量地址。这样如果我们有函数或是变量的地址无法确定(可能是没有写函数的实现,或是有两种 函数的实现,我们无法确定选那个来链接)就会出现链接错误。就像我们在一个头文件中定义了一个const类型的整形常量a和一个int i类型的整形量。如果我们在几个.cpp文件中载入了此.h文件。经过预处理后我们进行编译时,在一个cpp文件中我们遇到一个变量i我们会把他登记入 库,并给他地址。我们编译另一个.cpp之后我们的变量表中可能就会有两个对同一个变量i的两个记录。到了链接阶段我们就会发现我们无法确定链接的地址 了。这时就是一个链接错误了,呵呵。
c++ 编译之头文件
最新推荐文章于 2024-09-07 05:15:02 发布