C++:无法解析的外部符号问题 与 头文件包含注意要点

C++报错信息:LNK2001:无法解析的外部符号 原因分析及解决方法 C++报错信息:LNK2001:无法解析的外部符号 解决方法及原因分析,error LNK2019: 无法解析的外部符号 阅读详情

前要

由于种种原因,很长时间没有完整地编写一个C++程序。近期编写的程序都是简单地算法实现程序和简略的模拟程序,对于C++的许多特性都变得模糊不清。为了完成暑假的操作系统大作业——文件系统的模拟实现,从0开始写一个完成的程序。开始都进行得十分顺利,但编写完主要的头文件与cpp文件后,准备开始测试函数,进行Debug时,VS却提示大量错误信息,其中大都是:无法解析的外部符号。几天(暑假时间,不是没天都有大量时间认真编程,见笑了)时间过去后,尝试了多种解决方法终于找到了问题所在。于是有了写下搜寻过程的想法,要是有人能看这篇文章快速解决自己的问题,那就更好了。
结论:真正引起的错误的原因在于头文件的包含是否得当!

无法解析的外部符号

当我进行调试时,就会出现如下的错误信息:

1>UserOpenedFile.obj : error LNK2019: 无法解析的外部符号 “public: __thiscall
OpenedFile::OpenedFile(void)” (??0OpenedFile@@QAE@XZ),该符号在函数 “public:
__thiscall UserOpenedFile::UserOpenedFile(void)” (??0UserOpenedFile@@QAE@XZ) 中被引用 1>UserOpenedFile.obj : error LNK2019:
无法解析的外部符号 “public: __thiscall OpenedFile::~OpenedFile(void)”
(??1OpenedFile@@QAE@XZ),该符号在函数 “public: void * __thiscall
OpenedFile::`scalar deleting destructor’(unsigned int)”
(??_GOpenedFile@@QAEPAXI@Z) 中被引用 1>UserOpenedFile.obj : error LNK2019:
无法解析的外部符号 “public: class SFile * __thiscall OpenedFile::GetFile(void)”
(?GetFile@OpenedFile@@QAEPAVSFile@@XZ),该符号在函数 “public: void __thiscall
UserOpenedFile::ShowOpenedFile(void)”
(?ShowOpenedFile@UserOpenedFile@@QAEXXZ) 中被引用 1>UserOpenedFile.obj :
error LNK2019: 无法解析的外部符号 “public: int __thiscall
OpenedFile::GetOperatingType(void)”
(?GetOperatingType@OpenedFile@@QAEHXZ),该符号在函数 “public: void __thiscall
UserOpenedFile::ShowOpenedFile(void)”
(?ShowOpenedFile@UserOpenedFile@@QAEXXZ) 中被引用 1>UserOpenedFile.obj :
error LNK2019: 无法解析的外部符号 “public: int __thiscall
OpenedFile::GetReadPointer(void)”
(?GetReadPointer@OpenedFile@@QAEHXZ),该符号在函数 “public: void __thiscall
UserOpenedFile::ShowOpenedFile(void)”
(?ShowOpenedFile@UserOpenedFile@@QAEXXZ) 中被引用 1>UserOpenedFile.obj :
error LNK2019: 无法解析的外部符号 “public: int __thiscall
OpenedFile::GetWritePointer(void)”
(?GetWritePointer@OpenedFile@@QAEHXZ),该符号在函数 “public: void __thiscall
UserOpenedFile::ShowOpenedFile(void)”
(?ShowOpenedFile@UserOpenedFile@@QAEXXZ) 中被引用
1>C:\Users\Administrator\Desktop\操作系统大作业\OsTask\Debug\OsTask.exe :
fatal error LNK1120: 6 个无法解析的外部命令

经过简单的搜索后,可以得到出现这个错误的错因大多数在于:

[0]出现无法解析可能是因为lib文件不正确,比如64位的编译配置,结果使用的是32位的lib包.
[1]只写了类声明,但还没有写实现类,造成调用时无法解析 [2]声明和定义没有统一,造成链接不一致,无法解析
[3]没有在项目属性页的链接器的命令行选项加入相应的类包。 [4]没有在c++包含目录和库目录加入相应的类包路径
[5]在测试工程中被测文件目录可能需要包含被测类的cpp定义文件
[6]ICE接口测试时,无法解析可能因为被测文件没有包含进相关的cpp文件,另外,在TestSuite_ProjectRun.h文件中需要包含IProjectRun.h头文件,及相关的头文件(举例)。
[7]import相关的无法解析内容,解决办法是在链接器的依赖项中加入相应的动态库 [8]出现如下错误的原因一般是动态库没有包进来。
[9]error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
工程属性,C/C++,代码生成,运行时库选择MDd,

# 引用于http://blog.youkuaiyun.com/enotswn/article/details/5934938 优快云中enotswn博主的原创

于是我分析得到,无法解析的外部符号这个错误出现的问题可以归结为:编译器在使用某个函数或类时无法得到该函数或类的具体实现。而我的程序中调用库的函数仅有一两个,且系统的错误提示中是我编写的类中的函数无法解析。最初进行调试时,因为还有部分类的实现我还未编写(先保证已编写的代码正确性,防止编写了大量代码后出现Bug却无从下手)。

我有些抓不到头脑,无法解释的外部符号是编译器无法找到具体的实现所导致的,这个观点我坚信是没有问题的,基于对代码的编写确信没问题的观点,我的第二个猜测:会不会是我的笔记本环境变量或是哪个配置出现问题而导致的? (个人认为:出现这种情况的概率十分之小)于是我将文件发送到我的台式电脑,再次尝试编译,果不其然,依旧出现相同的错误提示!

问题究竟出在哪?我想着问题范围应该就在于头文件了。于是,抱着尝试的心态搜索了C++头文件包含的要点。这一搜,我就找到问题所在了!

实际中编码设计过程中,最基本的一个原则就是在类的头文件中最好不要包含其他头文件,因为这样会使类之间的文件包含关系变得复杂化。要最大限度的遵守这个原则,实际编码设计过程可以采用以下两种方法:

方法一是在设计一个类的时候尽量保持类的独立性,即使该类尽可能不要依赖其他类库或者函数库,或者退一步来说,尽量不要在类的声明中依赖其他类。这样,在 该类的声明头文件中就可以没有其他头文件。如果实现中用到了其他的类,那么可以只在该类的实现文件中包含用到的类库或者函数库的头文件就行。

方法二是当类的声明中必须得用到其他类库或者函数库时,方法一便不再适用,当一个类声明中引用的是其他类或结构的指针引用或者是函数引用时,也可以保持上
述原则,做法是采用前向引用,及在该类的声明前面先声明一下该类所用到的类名或者函数名就行。当类声明中引用的是其他类的实例时,上述原则变不能保持,只
有在该类的声明头文件中引用所引用的类库或者函数库的头文件。

#引用于 http://blog.youkuaiyun.com/u014108137/article/details/26337405 优快云博主Acepoint的转发

我想我找到了错误的原因所在:由于在编写代码时,我根据所画的UML图,将头文件都写好了,于是在自定义类对象中,使用自定义类对象作为类成员的时候,我自然而然地直接使用了自定义类对象这个类型,而非使用自定义类对象的指针!为了使编码时编译器不出现错误,我自然需要 * 将所使用到的类的声明头文件包含在另一个头文件中!* 这个就是导致错误的真正原因!

//A.h
#progma once
#include“B.h”
class A{
int userFile;
B   b;
}

若是只有一两个头文件,这样的包含关系或许不会导致错误(这也是我到大二快结束才发现这个错误的原因:以前我的习惯是将所有类的声明放在一个头文件当中。这个做法不可取),但是一旦头文件较多,复杂的包含关系就会导致编译器没编译部分头文件或无法找到与头文件相关的cpp文件(这一点我并非十分确定)。在这样的情况下,就会出现:无法解析的外部符号 这样的错误。

正确的做法

为了避免这样的错误,正确的做法(我采取的做法)是什么呢?
将上述这样的声明改为:

//A.h
#progma once
class B();

class A{
int userFile;
B*   b;
}

①不包含其他的头文件。若要使用自定义类对象,使用前置声明 的方法。
②使用自定义类的指针,而非直接使用该类型。

注意要点

最后稍微列一下C++包含头文件的顺序,同样来源于上一个引用链接。

要注意的是一些头文件也有依赖关 系,这些文件的包含顺序也小心,否则就会出错。ps,头文件的包含顺序应该是从最特殊到一般,比如:我们应该以这样的方式来#include头文件:
从最特殊到最一般,也就是

#include "本类头文件"
#include "本目录头文件"
#include "自己写的工具头文件"
#include "第三方头文件"
#include "平台相关头文件"
#include "C++库头文件"
#include "C库头文件"

小记:这篇博文是我的第一篇博文,谈的不是什么深刻的东西,只是我自己在解决遇到的问题的一些小小心得。作为一个不及格的程序员,行文过程中保不准出现哪些错误,若是有读者能看到并给出一些宝贵的评价,我将无限感激。

C++头文件注意要点 & 编译错误常见错因 由于种fei种chang原lan因duo,至今没写过什么大项目,每次项目里都只有那么两个三头文件,最近想写项目的时候才发觉连头文件互相包含的基本要求都不清楚,只是印象中有过因为头文件而导致编译失败的经历,所以特地查了一下相关的内容,整理在这里 注意要点 修改自 优快云 - C++头文件包含注意要点 方法 在引用一个符号(包括变量,函数,结构,类等)之前确保它已经声明或者已经定义。 ... 阅读详情

相关推荐

Visual Studio实战:3分钟解决C++项目中的‘无法解析外部符号‘问题(含CMake项目特例)

本文针对Visual Studio中C++项目常见的'无法解析外部符号'(LNK2001)错误,提供了一套从理解编译链接本质到快速排查的实战指南。文章详细解析了错误成因,并给出了从检查定义缺失、配置库文件链接到处理CMake项目特例的完整解决方案,帮助开发者高效定位并修复这一经典链接器报错。

rr23456的博客 728

编译链接过程中出现“无法解析的外部符号”,原因及解决办法总结

1、错误为:error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _OBJ_create_objects 中被引用 原因:__report_rangecheckfailure是用来检查堆栈缓存溢出的,如果编译的时候打开GS(project property--》Configuration properties--》c/c++......

fanzirong_的博客 12万+

C++ virtual 与 inline (无法解析的外部符号, 未知的#endif )

Mac 下的一套代码编译不报错,但在 windows 下编译时出错:无法解析的外部符号 或 未知的 #endif。 不同平台下的C++写法要求不同,所以必须严格按照C++标准写代码SKpacketParser.h 如下class SKPacketParser { public: SKPacketParser() {}; virtual ~SKPacketParser() {}; public

u014486706的博客 1338

“error LNK2019: 无法解析的外部符号”原因总结

C++工程编译时出现如下链接错误提示: 原因一:只是在.h里面声明了某个方法,没有在cpp里面实现; 原因二:在工程中加入了有相同名字的文件或者类; 原因三:如果此类为静态库中定义的类,可能没有添加头文件目录和文件引用的lib静态库路径; 添加方法: 添加工程的头文件目录: 项目->属性->配置属性->C/C++->常规->附加包含目录:加上头文件的存放目录; 添加文件引用的lib静态库路径: 项目->属性->配置属性->链接器->常规->附加

woshigaowei5146的博客 7万+

vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案

  运行vs程序的时候,报错严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "__declspec(dllimport) public: void __cdecl PointCloudFilter::setptClouds(struct LAS_POINT *)" (__imp_?setptClouds@PointCloudFilter@@QEAAXPEAULAS_POINT@@@Z),该符号在函数 "private: void __cdecl PointClou

zeeq的博客 36万+

C++链接报错: error LNK2001: 无法解析的外部符号

一般说

m0_60352504的博客 1万+

C++头文件包含导致无法解析的外部符号问题

【问题背景】 任务: C++实现文件拷贝,要求有界面输入源文件地址和目标文件地址,点击一个按钮将源文件夹下的全部都拷贝的目标文件夹下,另外最后的.exe要可以在cmd中输入两个参数实现同样的文件拷贝 实现: 界面用Qt事件,写一个copyFile函数有两个参数src和dst,点击按钮事件会调用copyFile函数并将界面获取的路径传入完成拷贝,main函数也接收参数,所以如果接收到说明用户...

不知小姐 4624

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 266

error LNK2019: 无法解析的外部符号 产生原因及修改方法

比较权威的解释可参考微软官方文档https://docs.microsoft.com/en-us/previous-versions/799kze2z(v=vs.140)?redirectedfrom=MSDN 我的开发环境是Visual Studio 2013 Community,使用语言是C++,遇到这个问题时正在自己做DLL自己调用,在调用时出现这个错误。 这里简述官方文档中列举的常见发生原因,这里结合我的经历做一些记录,加粗部分为原文内容: The object file or libra

weixin_42775777的博客 2万+

手把手复现金蝶云星空V8.1文件上传漏洞(附完整POC与修复方案)

本文深度解析金蝶云星空V8.1文件上传漏洞,提供详细的漏洞复现步骤与完整POC,涵盖技术原理、测试环境搭建及验证流程。同时给出多维防护方案,包括官方补丁部署、临时缓解措施和长期安全加固建议,帮助企业有效防范任意文件上传风险。

weixin_30505225的博客 183

告别OpenAI API调用:手把手在本地CPU/GPU上部署fast-whisper中文语音识别模型

本文详细指导如何在本地CPU/GPU上部署fast-whisper中文语音识别模型,摆脱对OpenAI API的依赖。从环境准备、模型获取与优化,到CPU/GPU环境的具体部署步骤和性能优化技巧,全面覆盖本地化语音识别的实现方案,帮助开发者提升效率并保障数据隐私。

weixin_29988907的博客 307

VS常见错误之一:LNK2019 : 无法解析的外部符号

问题样式: LNK2019 : 无法解析的外部符号 xxx 中被引用 采用开源程序,忘记添加依赖项,这个是最常见的问题。解决办法如下: 右键打开项目属性 C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项 链接器、常规、附加库目录:填写附加依赖库所在目录 分号间隔多项 链接器、输入、附加依赖项:填写附加依赖库的名字.lib 空格或分号间隔多项 如果还是不行,更换与依赖项合适的平台: 如果没有,就新建平台 在新的平台下再右键打开项目属性配置选项(再次执

ymxyld的博客 4万+

Clion编译stm32cube初始化工程时non constant or forward reference address expression for section .ARM.extab报错

相信应该有同学在看了稚晖君关于clion开发stm32的文章之后也想在自己PC上实现“优雅の嵌入式开发”遇到和我类似的问题。他的文章是22年写的,我个人猜测应当是版本更新导致的不适配。意思就是说 READONLY 只能在gcc11以后的版本中使用,gcc10及以前的版本将无法正确识别,也就有如下错误。或者就可以将gcc升级至最新的版本。记得在clion工具链中修改c,cpp编译器的位置。可以将文本括号中的 READONLY 全部删除。当时由于没有注意到这行注释导致在这里卡了好久。

2301_77256849的博客 2512

C++ error LNK2019: 无法解析的外部符号 错误解决方案

今天在实现类模板实例化的时候遇到一个问题,就是把类模板函数实现放到类的cpp文件中,然后在main函数中使用这个类的时候,就会出现无法解析的外部符号函数名(xxxx)等错误,那么出现这个错误的原因是什么呢?博主遇到以上问题的原因是将“xxx.cpp”文件添加进了头文件中,若将对应的cpp文件添加进源文件中则不会出现此类报错。从项目的链接,项目的属性设置考虑,而不是从代码本身的角度考虑)原因就是现在的编译里不支持模板函数的申明和实现分开,要像上面那样使用类成员函数,有以下两种方法。.........

qq_273058791的博客 5780

[毕设项目-大模型微调]现代文翻译文言文【基于LLaMA3.1-8B微调】

教你基于LLaMA3.1-8B微调如何做到现代文翻译文言文

逐梦苍穹的博客 2296

OpenCV实例(二)手势识别

手势识别的范围很广泛,在不同场景下,有不同类型的手势需要识别,例如:● 识别手势所表示的数值。● 识别手势在特定游戏中的含义,如“石头、剪刀、布”等。● 识别手势在游戏中表示的动作,如前进、跳跃、后退等。● 识别特定手势的含义,如表示“OK”的手势、表示胜利的手势等。理论基础凸包和凸缺陷在图像处理中具有非常重要的意义,被广泛地用于图像识别等领域。逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包和逼近多边形很像,只不过凸包是物体最外层的凸多边形。

小幽余生不加糖 9410

VS报错无法解析的外部符号.....

我们在使用VS编译器编写C代码运行时提示:严重性 代码 说明 项目 文件 行 禁止显示状态错误 LNK2019 无法解析的外部符号 _main,函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中引用了该符号 StudyCProject E:\VisualStudioProjects\StudyCProject\StudyCProject\MSVCRTD.lib(exe_main.obj) 1有多种方法会造成此错误。 所有这些方法都涉及引用链接

qq_45615577的博客 6718

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1291

Onvif 无法解析的外部符号 soap_in_xsd__dateTime问题,解决(一)

无法解析的外部符号问题也困扰我很久,最后才发现是因为没有添加文件问题,我的天呀!! 问题描述: 1> 正在创建库 G:\onvif\Onvif_Client\onvifClient\Debug\onvifClient.lib 和对象G:\onvif\Onvif_Client\onvifClient\Debug\onvifClient.exp 1>soapC.obj : error LNK2019: 无法解析的外部符号 “struct timeval * __cdecl soap_in_xsd__

Feng的博客 4421

CAMERALINK硬件封装说明

闲言少叙,直接上活,Cameralink硬件接口当前主要分为MDR26和SDR26两种,其中MDR对应封装较大价格比较便宜,SDR对应尺寸较小价格比较贵,这点我个人总是记错的图1 MDR26实物图图2 SDR26实物图。

6170

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

“error LNK2019: 无法解析的外部符号”的几种可能原因,已解决。

环境:Window10+ Visual Studio 2019 也适用于其他版本 究其原因,只不过是程序里用了某个函数,这个函数依赖于某个库文件,然后程序并没有找到这个库文件,所以要么是没添加,要么就是添加错了,没添加请参考第一个办法,添加错误请参考第二个办法。 1. 采用第三方库或者开源库,忘记添加依赖项,添加方法:(建议采用相对路径,关于相对路径请参照博客https://blog.youkuaiyun.com/weixin_44330072/article/details/106492533 解...

Ujiggg的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

无法解析的符号错误

转自:http://blog.youkuaiyun.com/enotswn/article/details/5934938 在使用vs2008调试程序的过程中,经常会出现无法解析的外部符号问题,可能的原因有很多种,下面这些是我一年来积累的经验. 仅供参考. 考虑可能的原因: [0]出现无法解析可能是因为lib文件不正确,比如64位的编译配置,结果使用的是32位的lib包. [

renzeGIS的专栏 1831

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

编译时报错“LNK2019 无法解析的外部符号”的可能原因及其解决办法

在VS2022中运行C++程序的时候,有时会遇到编译时报错:“LNK2019 无法解析的外部符号”的情况。本文介绍了这种问题的可能原因及其解决办法(欢迎关注,持续更新)。

欢迎来到我的优快云个人博客主页! 6005

在C++控制台项目中使用C工程代码时的注意,避免出现error LNK2019: 无法解析的外部符号

当我们在写 C++控制台项目时候,有时用到一些线程的算法代码项目,这些代码项目是用c写的。当使用时,需要在c的头文件中标注如下内容,才能使得cpp文件能够编译使用c的函数等,才避免在编译时候出现error LNK2019: 无法解析的外部符号###,在_main中引用,这样的错误。如下面: 号 "int __cdecl sift_features(struct _IplImage *,struc

andyfu57的专栏 3984

解决:无法解析的外部符号__iob_func

无法解析的外部符号__iob_func错误通常是由于编译器和链接器之间的配置问题所引起的。通过正确配置编译选项、库文件路径和链接器选项,通常可以解决这个错误。此外,升级编译器版本和检查代码依赖关系也有助于解决这个问题。希望本篇文章对解决无法解析的外部符号__iob_func错误提供了一些帮助和指导。printf("无法打开文件\n");return 1;fprintf(file, "这是一个示例文件。\n");return 0;在这个示例代码中,我们使用了标准库函数fopenfprintf和。

牛肉胡辣汤 1894

解决 错误LNK2001无法解析的外部符号

要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。函数内声明的变量(局部变量) 只能在该函数的范围内使用。C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在 头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种 方法是使用时给该变量赋以常数。

xuxuxucq的博客 1184
下一篇: git bash【初级入门篇】
P3ray
博客等级 码龄9年 6粉丝 1原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值