vs 中 编译c++多文件程序, 为什么在编译阶段不出错,却在连接阶段出错了呢

清水迎朝阳
博客专家认证
2008-11-22 05:01:54
出错信息 变量我只在一个文件中声明了 而且这个文件也保证在主文件中只被包含进一次


我就是一个 Queue.h // 定义队列结构 和参数
一个 function.cpp // 定义函数
一个 PT.cpp // main 函数


包含关系 function.cpp 文件中 : include"Queue.h"
PT.cpp : include"function.cpp"

并没有重复包含啊 为什么编译没事 链接时出现如下错误, 没发现多重定义啊




1>正在编译...
1>PT.cpp
1>d:\grid\pt\pt\pt\function.cpp(145) : warning C4715: “intersect”: 不是所有的控件路径都返回值
1>正在链接...
1>function.obj : error LNK2005: "void __cdecl InitQueue(struct SeqQueue *)" (?InitQueue@@YAXPAUSeqQueue@@@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "bool __cdecl DeQueue(struct SeqQueue *,struct QueueElementType *)" (?DeQueue@@YA_NPAUSeqQueue@@PAUQueueElementType@@@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "void __cdecl GetHead(struct SeqQueue *,struct QueueElementType *)" (?GetHead@@YAXPAUSeqQueue@@PAUQueueElementType@@@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "bool __cdecl intersect(struct QueueElementType,struct QueueElementType)" (?intersect@@YA_NUQueueElementType@@0@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "bool __cdecl intersect(struct QueueElementType,struct square_A)" (?intersect@@YA_NUQueueElementType@@Usquare_A@@@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "bool __cdecl inter(struct QueueElementType,struct QueueElementType)" (?inter@@YA_NUQueueElementType@@0@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double __cdecl area_nonself(struct QueueElementType * const)" (?area_nonself@@YAOQAUQueueElementType@@@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double __cdecl _max(long double * const)" (?_max@@YAOQAO@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double __cdecl _min(long double * const)" (?_min@@YAOQAO@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double __cdecl mean(long double * const)" (?mean@@YAOQAO@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double __cdecl sd(long double * const,long double)" (?sd@@YAOQAOO@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "bool __cdecl EnQueue(struct SeqQueue *,struct QueueElementType)" (?EnQueue@@YA_NPAUSeqQueue@@UQueueElementType@@@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "void __cdecl detec(long double,long double,long double)" (?detec@@YAXOOO@Z) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "struct SeqQueue * p1" (?p1@@3PAUSeqQueue@@A) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "struct SeqQueue Q" (?Q@@3USeqQueue@@A) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double rs" (?rs@@3OA) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double r0" (?r0@@3OA) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "struct QueueElementType * self" (?self@@3PAUQueueElementType@@A) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "struct square_A * test" (?test@@3PAUsquare_A@@A) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "int n_time" (?n_time@@3HA) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "int n_r" (?n_r@@3HA) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double s_all" (?s_all@@3OA) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "long double sum" (?sum@@3OA) 已经在 PT.obj 中定义
1>function.obj : error LNK2005: "class std::vector<struct QueueElementType,class std::allocator<struct QueueElementType> > detector" (?detector@@3V?$vector@UQueueElementType@@V?$allocator@UQueueElementType@@@std@@@std@@A) 已经在 PT.obj 中定义
1>D:\grid\PT\PT\Debug\PT.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
...全文
248 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hslgzfl 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 non_recursive 的回复:]
重定义了,楼主不要多次包含相同的文件...

最好用一下
#ifndef ...
#define ...

//...

#endif
[/Quote]

9494 楼主不要轻易的包含.c文件,因为.h习惯用避免重定义的机制,所以可以随便包含滴。其实你想用某个函数,可以外部声明滴。当然,外部声明也是有弊端滴,所以建议楼主还是包含.h文件。
就呆在云上 2008-11-22
  • 打赏
  • 举报
回复
  PT.cpp              :  include"function.cpp" 


不要这句。
带了头文件,然后,把cpp文件都一起编译
rainbow_free 2008-11-22
  • 打赏
  • 举报
回复
up
P_ghost 2008-11-22
  • 打赏
  • 举报
回复
包含cpp文件应该避免,不要硬要包含需要注意重定义问题。
霍大脚 2008-11-22
  • 打赏
  • 举报
回复

主程序代码应该包含头文件,不是头文件的相关的实现文件,且为了防止多次定义头文件,头文件里用
#ifndef ...
#define ...
statements
#endif
Non_Recursive 2008-11-22
  • 打赏
  • 举报
回复
重定义了,楼主不要多次包含相同的文件...

最好用一下
#ifndef ...
#define ...

//...

#endif
帅得不敢出门 2008-11-22
  • 打赏
  • 举报
回复
贴代码
toadzw 2008-11-22
  • 打赏
  • 举报
回复
include"function.cpp",不要包含这个,而是包含头文件.h文件的那个 PT.cpp include"function.h"

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧