是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述以下:#include指令做用是将指定的文件嵌入到当前源文件中#include指令所在的位置。c++
而后我就想5_10.cpp主程序直接include了point.cpp也能够吧(由于point.cpp里include了point.h,这样既有声明又有定义)。没错,书中继续描述被嵌入的文件能够是.h文件,也一样能够是.cpp文件。可是当我在eclipse for c++环境里验证的时候却打脸了,让我一度怀疑是否是不能#include .cpp。vim
eclipse中在链接的那一步报错了,以下:数据结构
并无认真看eclipse中报错内容的我在vim中一顿操做验证结果明明能够引入cpp的啊。上半部分是include .h的测试,下半部分是include .cpp的测试,均可以看出在生成.o文件也就是编译生成目标代码并没啥错,就在链接步骤引入.h的却报错,引入.cpp却正常(这结果与在eclipse中恰好相反啊),这不由让我思考了起来,哦发现了,在命令行中我是用命令指定编译哪一个cpp文件,在引入.h的test.cpp测试中我只编译了test而没有编译也没链接point.cpp,因此链接时候找不到函数地址就很正常了(能够注意到它报的错是undefined,而eclipse中报的是duplicate,这就是区别...)eclipse
回到eclipse,往上翻错误,看到eclipse好像是把我项目底下全部cpp都给编译了,一看果真是...emmm make all。其实编译就编译吧也没有啥影响最后别链接那些我没用的就行,可是能够看到这个真的是linker 了all啊..函数
因为我在main.cpp中include了6文件夹的Point.cpp,这就至关于把6文件夹下的Point.cpp编译了两次(产生了两个关于point.cpp的符号表,关于什么是符号表,就是把程序中各个标识符名称和它们在各段中的地址关联起来的数据结构,见下图)。而后在链接的时候,是将各个编译单元的目标文件和运行库当中被调用过的单元加以合并,通过合并后不一样编译单元代码段和数据段就分别合并到一块儿,与此同时,各个目标文件的符号表也能够被综合起来,链接最后符号表的每一个条目都必须有肯定的地址。然而eclipse链接报错就报错在符号表的函数地址应该是什么,main中所引用的Point.cpp和6文件夹的Point.cpp是一个东西,但却在生成.o文件时候符号表中的Point类的各个函数各自有了地址。学习
符号表可以被正确综合的一个前提是,对于同一个符号,只在恰好一个编译单元中有定义,而在其余编译单元中是未定义的。之因此有这个要求是由于合并后符号表中各个符号的地址须要根据该符号在有定义的编译单元中的相对地址来肯定。若在多个编译单元中同一个符号都有定义地址,那么它的地址将无所适从,就会出现符号定义冲突的链接错误。因此能够看到eclipse给出的错误提示是"duplicate symbol".测试
其中形如__ZN5...的名字是函数名,在符号表中函数并不仅以它在源程序中的名字命名,函数在符号表中的名字至少包括源程序的函数名和参数表类型信息。由于函数能够重载,因为符号表中没有专门的类型信息,参数表信息只能在名字中有所体现,不然在目标文件中没法对函数名相同单参数不一样的函数加以区分。look,其中move函数就是我point类中定义的一个成员函数,剩下的都是构造函数(我定义的+类中默认的其余构造)或析构函数把。因此,看来在eclipse中要非想引用cpp文件就要本身重写eclipse中的make文件咯,另外还须要认真看报错咯,不能一顿盲猜想。命令行
tip:若是5和6下的point.cpp都定义过相同标识符的成员,那么在链接的时候也会报错duplicate,看来在链接的时候并不会因所在文件夹不一样就有区分,由于链接要肯定每一个标识符有惟一地址3d