C标题和CPP包括
快速的问题.
我试图让C被钉下来,今天我花了几个小时的双定义链接器错误(“这已经定义了!”)我终于意识到这是因为我有这样的布局: > main.cpp #include Dog.cpp > Dog.cpp #include Dog.h > Dog.h // (Dog class and prototype of test function) 现在我通过在main.cpp中包含Dog.h而不是Dog.cpp来清除它. 通过包含.h文件,具有相同前缀的.cpp文件是否可以用程序编译? 当程序只包含.h并且没有任何对Dog.cpp的引用时,我感到震惊.我花了很多年的谷歌搜索,但没有答案真的帮助我理解发生了什么. 编辑:我忘了添加我在.h中的原型,并在.cpp中为类定义了函数,这就是给出了“已定义”错误的原因. 解决方法
没有. 您的程序是分阶段构建的. >对于编译阶段,每个翻译单元只需要声明(大致相当于单个.cpp文件,其中#includes已解决).声明甚至首先存在的原因是作为一种“承诺”,以后可以找到完整的函数定义. g++ -c Dog.cpp # produces `Dog.o` g++ -c main.cpp # produces `main.o` >对于链接阶段,在翻译单元之间解析符号.您必须将编译Dog.cpp和编译main.cpp的结果链接在一起(也许您的IDE正在为您执行此操作?),此链接进程会在它们之间找到所有正确的函数定义以生成最终的可执行文件. g++ Dog.o main.o -o program # produces executable `program` (或者你实际上还没有进入链接阶段,只有一个目标文件(Dog.o);你不能执行它,部分原因是因为它没有所有的函数定义.) 这两个阶段可以同时完成,“速记”: g++ Dog.cpp main.cpp -o program # compiles,links and produces executable (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- net.sf.json.JSONException: There is a cycle in the hier
- Flex框架及最详细比较 MX and Spark组件
- uitableview – 使用Swift的“使用未解析的标识符”
- ruby-on-rails – psql错误:关系已经存在
- TiDB 源码阅读系列文章(二)初识 TiDB 源码
- c – 在不需要默认构造函数的情况下插入或更新到unordered_
- ruby-on-rails – Ruby on Rails Collection选择 – 如何预
- VB封装DLL文件讲解---2
- c – 具有不同签名的类方法专业化
- opencv 2.x学习笔记(十一)读写xml文件