- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
⽆法解析的外部符号解决⽅法汇总
⼀、使⽤lib库
静态链接库和动态链接库都需要使⽤.lib⽂件。对于静态链接库来说,.lib⽂件包含了函数的说明和定义;⽽对于动态链接库来说,.lib⽂件只
有函数的说明,运⾏时还需要.dll⽂件。那么如何使⽤.lib⽂件呢?有三种⽅法:
第⼀种⽅法:⾸先,在VisualStudio中项⽬-属性-连接器-常规-附加库⽬录写上.lib库所在⽂件夹;其次,项⽬-属性-连接器-输
⼊-附加依赖项中写上.lib库的名称。
第⼆种⽅法:在.h或.cpp⽂件中⽤编译预处理指令#pragmacomment(lib,XXX.lib);
第三种⽅法:VisualStudio中,例如,你的解决⽅案⾥A,B两个⼯程,B⼯程⽣成.lib库共A⼯程⽤,那么就右键A⼯程引⽤-通⽤属性-
框架和引⽤-添加新引⽤选择B⼯程即可。
⼆、⽆法解析的外部符号问题
出现这个问题,不⽤怀疑,⼀定是你没有包含lib库,或者没有正确包含lib库。何谓没有正确包含?32位的项⽬不能使⽤64位的lib,反之亦
然;有时候Debug模式下⽣产的lib也不能共Release模式使⽤,反之亦然。
⾼级玩家看:
当然我刚才说的出现“⽆法解析的外部符号”就是没有正确包含lib库仍有些⽚⾯,例如,VisualStudio的⼀个解决⽅案有A、B两个⼯
程,B⽣成dll供A使⽤,A正确包含了B的dll和lib,可是有时候还是会出现B总定义的函数“⽆法解析的外部符号”问题。这个原因可能为:
B既然是要⽣成dll共A使⽤,那么B中的函数和类以及全局变量都要申明为__declspec(dllexport);⽽A中也需要申明这些函数(或类或全局
变量)为__declspec(dllimport)。以类为例,加⼊B中定义类TestB那么TestB.h应该这样:
1prename=codeclass=cpp//TestB.h
2#ifdefinePROJECT_B
3#defineDLL__declspec(dllexport)
4#else
5#defineDLL__declspec(dllimport)
6#endif
7classDLLTestB{
8//
9};
项⽬B中在属性-C++-预处理器-预处理器定义中定义PROJECT_B,这样,项⽬B就申明类TestB为__declspec(dllexprot);⽽项⽬A
包含了头⽂件TestB.h,但是没有定义预处理器宏PROJECT_B,则申明TestB为__declspec(dllimport)。
三、visualstudio诡异bug
没有使⽤其他lib库,只是⼀个.cpp⽂件使⽤另⼀个.cpp⽂件⾥定义的类函数,结果⼀直报“⽆法解析的外部符号错误”。
最后重新添加.h⽂件.cpp⽂件,把出问题的.h⽂件.cpp⽂件从项⽬中移除,并拷贝到新的.h和.cpp⽂件⾥,才解决。
2017-5-223:49:16更新“三、visualstudio诡异bug”
四、内联函数也可能导致“⽆法解析的外部符号”错误
今天重⽤别⼈的代码,总有⼏个“⽆法解析的外部符号”错误解决不了,函数都是有定义的。最后发现,只要把函数定义前的inline去掉就
好了。
2017-7-423:05:40更新
五、其它
我做⼯程时学到的⾃认为⽐较有⽤的东西:
1.VisualStudio的“查找和替换”以及“在⽂件中查找”功能,只能查找解决⽅案视图下的⽂件,如果你的.h⽂件没有包含进项⽬(即使
其它的.h或.cpp⽂件包含了这个.h),那么就不会被搜索到。
2.有时候引⽤附加库的编译预处理指令#pragmacomment(lib,XXX.lib)会放在头⽂件⾥,正如1.所说,如果包含#pragma的.h⽂件没
有添加进项⽬,就不会被搜索到。这时候,你可能觉得奇怪,明明需要使⽤B.lib,可是A⼯程的项⽬配置⾥⼜没有引⽤。原因就在这。我也
是被这个问题困扰了⼀下午,才终于搞明⽩。
3.搜索功能要学会使⽤正则表达式,例如我要搜索#pragmacomment这个指令,但不知道#pragma和comment之间有⼏个空格,怎么
办?pragma.*comment就⾏了。
您可能关注的文档
最近下载
- 成都市金牛区2020-2021学年下学期一年级期末考试语文试卷(部编版).pdf VIP
- 儿科“一科一品”之做有温度的护理人.pptx VIP
- 2025年广州数学中考试题及答案.doc VIP
- 中文释义 PASS图解速记高中词汇正序版.xlsx VIP
- 辅警招聘考试公安基础知识(情景分析题)模拟试卷3(题后含答案及解析).pdf VIP
- 工程质量风险分级管控清单 .pdf VIP
- 生物医学工程先进制造:第一章 绪论-2015.ppt VIP
- 培养员工归属感培养员工归属感.ppt VIP
- 古方上篇后八方.张志峰老师讲解和答疑2016.3.5.doc VIP
- JingChaDaXue《灭火救援指挥》期末试卷(A)参考答案.docx VIP
专注于中小学教案的个性定制:修改,审批等。本人已有2年教写相关工作经验,具有基本的教案定制,修改,审批等能力。可承接教案,读后感,检讨书,工作计划书等多方面的个性化服务。欢迎大家咨询^
文档评论(0)