文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888
1、背景
今天周末在整理自己的常用函数库时,突然遇到了一个问题,觉得很有意思,和各位共享一下。
环境:
笔记本:win7 x64
编译器:Visual Studio 2015
编译环境:Release x86
问题描述:
1>STLMap.obj : error LNK2005: "void __cdecl merge(class std::vector<int,class std::allocator<int> > &,int,class std::vector<int,class std::allocator<int> > &,int)" (?merge@@YAXAAV?$vector@HV?$allocator@H@std@@@std@@H0H@Z) 已经在 ConsoleApplication.obj 中定义
1>STLMap.obj : error LNK2005: "int __cdecl maxProfit(class std::vector<int,class std::allocator<int> > &)" (?maxProfit@@YAHAAV?$vector@HV?$allocator@H@std@@@std@@@Z) 已经在 ConsoleApplication.obj 中定义
1>STLMap.obj : error LNK2005: "long __stdcall MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *)" (?MyUnhandledExceptionFilter@@YGJPAU_EXCEPTION_POINTERS@@@Z) 已经在 ConsoleApplication.obj 中定义
1>STLMap.obj : error LNK2005: "void __cdecl MyDumpGenerate(void)" (?MyDumpGenerate@@YAXXZ) 已经在 ConsoleApplication.obj 中定义
1>D:\VS2015\Project\AlivenProject\\ConsoleApplication\bin\Win32\Release\ConsoleApplication.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
问题分析:
首先说一下出现这种问题的前提:我在整理自己写的常用函数库时,将头文件都都已放在了一个 AlivenLibDef.h 文件中(新建的),但是我在链接(导入头文件)时,却链接(导入头文件)成了 ConsoleApplicationdef.h (项目的头文件,用于引入常用函数库)。
截图如下:
解决方案:
修改成正确的头文件进行链接(导入)。然后在编译就没问题了。
注意事项:
像这种问题,感觉一般会出现想我这样修改代码库结构(变更库文件)的情况下,或者更改部分库文件目录(路径)或者名称时会出现;说实话,当时出现时也是直接蒙了,按理说这些库我都用了很久了,怎么就出问题了呢。然后仔细分析了下错误描述,才发现原来是自己链接头文件搞错了。
这里做个笔记,以避免以后遇见类似的问题,同时也和各位共享下,以备日后遇到类似问题时,提供一种排查思路。
笔记跟新记录
时间 | 内容 |
---|---|
2020-11-08 | 创建笔记 |