无法解析的外部符号解决方法汇总[通俗易懂]

无法解析的外部符号解决方法汇总[通俗易懂]本文介绍了如何在工程中使用.lib库,以及出现无法解析的外部符号的原因和解决方法。

大家好,又见面了,我是你们的朋友全栈君。

一、使用lib库

静态链接库和动态链接库都需要使用.lib文件。对于静态链接库来说,.lib文件包含了函数的说明和定义;而对于动态链接库来说,.lib文件只有函数的说明,运行时还需要.dll文件。那么如何使用.lib文件呢?有三种方法:

第一种方法:首先,在Visual Studio中”项目->属性->连接器->常规->附加库目录”写上.lib库所在文件夹;其次,”项目->属性->连接器->输入->附加依赖项”中写上.lib库的名称。

第二种方法:在.h或.cpp文件中用编译预处理指令#pragma comment(lib, “XXX.lib”);

第三种方法:Visual Studio中,例如,你的解决方案里A,B两个工程,B工程生成.lib库共A工程用,那么就右键A工程”引用->通用属性->框架和引用->添加新引用“选择B工程即可。

二、无法解析的外部符号问题

出现这个问题,不用怀疑,一定是你没有包含lib库,或者没有正确包含lib库。何谓没有正确包含?32位的项目不能使用64位的lib,反之亦然;有时候Debug模式下生产的lib也不能共Release模式使用,反之亦然。

高级玩家看:

当然我刚才说的出现“无法解析的外部符号”就是没有正确包含lib库仍有些片面,例如,Visual Studio的一个解决方案有A、B两个工程,B生成dll供A使用,A正确包含了B的dll和lib,可是有时候还是会出现B总定义的函数“无法解析的外部符号”问题。这个原因可能为:B既然是要生成dll共A使用,那么B中的函数和类以及全局变量都要申明为__declspec(dllexport);而A中也需要申明这些函数(或类或全局变量)为__declspec(dllimport)。以类为例,加入B中定义类TestB那么TestB.h应该这样:

<pre name="code" class="cpp">//TestB.h
#ifdefine PROJECT_B
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
class DLL TestB{
//....
};


项目B中在”属性->C++->预处理器->预处理器定义”中定义PROJECT_B,这样,项目B就申明类TestB为__declspec(dllexprot);而项目A包含了头文件TestB.h,但是没有定义预处理器宏PROJECT_B,则申明TestB为__declspec(dllimport)。

三、visual studio 诡异bug


没有使用其他lib库,只是一个.cpp文件使用另一个.cpp文件里定义的类函数,结果一直报“无法解析的外部符号错误”。
最后重新添加.h文件.cpp文件,把出问题的.h文件.cpp文件从项目中移除,并拷贝到新的.h和.cpp文件里,才解决。
2017-5-2 23:49:16  更新“三、visual studio 诡异bug”
———————————————-

四、内联函数也可能导致“无法解析的外部符号”错误

今天重用别人的代码,总有几个“无法解析的外部符号”错误解决不了,函数都是有定义的。最后发现,只要把函数定义前的inline去掉就好了。
2017-7-4 23:05:40 更新
———————————————-

五、其它

我做工程时学到的自认为比较有用的东西:

1.Visual Studio的“查找和替换”以及“在文件中查找”功能,只能查找解决方案视图下的文件,如果你的.h文件没有包含进项目(即使其它的.h或.cpp文件包含了这个.h),那么就不会被搜索到。

2.有时候引用附加库的编译预处理指令#pragma comment(lib, “XXX.lib”)会放在头文件里,正如1.所说,如果包含#pragma的.h文件没有添加进项目,就不会被搜索到。这时候,你可能觉得奇怪,明明需要使用B.lib,可是A工程的项目配置里又没有引用。原因就在这。我也是被这个问题困扰了一下午,才终于搞明白。

3.搜索功能要学会使用正则表达式,例如我要搜索#pragma comment这个指令,但不知道#pragma和comment之间有几个空格,怎么办?pragma.*comment就行了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153469.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月28日 下午5:36
下一篇 2022年6月28日 下午5:46


相关推荐

  • pycharm加注释的快捷方式_pycharm如何批量注释

    pycharm加注释的快捷方式_pycharm如何批量注释1、主题  在开发项目的过程中经常需要创建任务列表,对于一些小任务,在代码中插入便签注释会有奇效。  这种注释的格式如下:  2、创建便签注释  非常简单:  首先,将光标定位到相应行。  然后,创建一行注释(Ctrl+Slash)。  最后,在#后面,输入TODO或者todo,然后输入注释  3、浏览便签  在T

    2022年8月28日
    6
  • 使用Vagrant配置本地开发环境「建议收藏」

    使用Vagrant配置本地开发环境

    2022年2月8日
    42
  • 初识数据库

    数据库初步认识什么是数据(Data)什么是数据库(DataBase简称DB)数据库分类:1.关系型数据库2.非关系型数据库关系型数据库:表和表之间相互关联可以建立表(即文件)关系型数

    2022年3月29日
    37
  • 如何锁定工作站[通俗易懂]

    如何锁定工作站[通俗易懂]如何锁定工作站        使用LockWorkStation函数即可锁定工作站。系统会显示一个锁定对话框,告诉用户此工作站正在使用并且已经被锁定,可以被执行锁定的用户或管理员解锁,解锁的方式是按下CTRL_ALT_DEL并用正确的帐号和密码登陆。      LockWorkStation函数成功调用的条件是:      调用者必须是运行在系统交互桌面上的一般进程。   

    2022年7月21日
    18
  • FCN的学习及理解(Fully Convolutional Networks for Semantic Segmentation)

    FCN的学习及理解(Fully Convolutional Networks for Semantic Segmentation)论文 FullyConvolu 是图像分割的 milestone 论文 理清一下我学习过程中关注的重点 fcn 开源代码 github 下载地址 https github com shelhamer fcn berkeleyvisi org 核心思想该论文包含了当下 CNN 的三个思潮 不含全连接层 fc 的全卷积 fu

    2026年3月26日
    2
  • stm32f1时钟分析

    stm32f1时钟分析

    2021年8月18日
    80

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号