Sch*_*ote 2 c++ linker compilation
我是一名经验丰富的程序员,但只有高级语言; 我正在用C++做我的第一个非常大的项目.
我有两节课,ClassA而且ClassB; a ClassA(除其他外)是索引ClassBs,因此ClassA需要知道ClassB从中构建数组是什么,并且ClassB需要知道什么ClassA是,所以当事情发生变化时它可以更新索引.这两个类都在他们自己的.h和.cpp文件中.
我认为从另一个中包含每个只会导致无限递归,所以我决定改为拥有#include "ClassA.cpp"并且#include "ClassB.cpp"在开始时main.cpp; 但这样做只会导致编译器警告这些文件中每个类和方法的多个定义.
经过一些实验,我发现包含ClassA.h并ClassB.h产生了所需的行为 - 但这没有任何意义,我只包括那些类的原型.当然,实际上使它们成立的代码永远不会混杂在一起?然而它确实如此.
这里发生了什么,我不明白?为什么包含ClassA.h也会使实际代码ClassA显示出来?为什么包括ClassA.cpp导致每个包含ClassA.h触发"多重定义"错误,即使它们在头部屏蔽或其他任何名称?
缺少的步骤是链接器中的定义ClassA.cpp和ClassB.cpp将不会被链接器看到,除非这些文件也在某些时候被编译.如果你做了这样的事情:
g++ main.cpp ClassA.cpp ClassB.cpp
Run Code Online (Sandbox Code Playgroud)
然后在定义的所有引用ClassA.cpp,并ClassB.cpp从main.cpp将得到解决.但是,如果你这样做了
g++ main.cpp
Run Code Online (Sandbox Code Playgroud)
然后链接器根本不知道在哪里可以找到的定义,ClassA.cpp和ClassB.cpp,你可能会得到一个错误.
如果你正在使用IDE,那么这个细节对你来说是隐藏的:IDE确保只要你将.cpp文件添加到你的"项目"中,它就会在你构建项目时被编译成最终的二进制文件.
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |