为什么出现“c无法解析外部符号的外部符号_main”?

无法解析的外部符号_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
无法解析的外部符号
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢为什么这个虚析构函数触发一个无法解析的外部?-c++,析构函数destructor,unresolved-external,virtual-method-CodeGo.net
为什么这个虚析构函数触发一个无法解析的外部?
考虑以下几点:
virtual ~X();
#include "X.h"
尝试建立这个(我是一个dll目标,以避免丢失的主要错误,和我'Visual Studio 2010中):
错误1错误LNK2001:无法解析的外部符号“private:虚拟__ thiscall X ::〜X(无效)”(?1X@@@EAE XZ)
但是小的修改导致生成,:
inline X(); // Now inlined, and everything builds
virtual ~X();
~X(); // No longer virtual, and everything builds
什么是无法解析的外部在链接的时候,析构函数是虚拟的或当。构造函数是不是inline?
或者,也许更有趣的是,为什么我没有得到一个无法解析的外部 CodeGo.net,如果我做的析构函数非虚,还是我inline的构造函数?
本文地址 :CodeGo.net/189883/
-------------------------------------------------------------------------------------------------------------------------
1. 情况1:
你有构造函数的代码。
因此,它建立在构造成目标文件。该构造函数需要析构函数的地址放入虚拟表不能找到它不能被建造的构造函数。
情况2:(inline的构造函数)
决定它并不需要建立构造函数(因为它会被inline)。
因此,它不种植任何代码,因此并不需要析构函数的地址。
如果你实例化类型X的对象时,它会
情况3:(非虚析构函数)
您不需要析构函数建立构造函数的地址。
它,如果你实例化类型X的对象
在C ++函数必须被定义,当且仅当它们在你的程序中使用(参见ODR在3.2 / 2).a般情况下 CodeGo.net,非虚函数,如果使用他们从潜在的求值的表达式调用。任何非纯虚函数被认为是无条件使用。当[非虚]函数用于在语言标准的专用位置定义。等等。
在你的优先个例子,你宣布你的析构函数作为非纯虚函数。这是你的析构函数被用在你的程序。这,反过来,也就是说,该析构函数的定义是必需的。你没有提供一个定义,因此报错。
在第三个例子中,析构函数非虚。既然你不使用析构函数在程序中,没有定义是必要的,(见12.4对于什么是使用析构函数的详细说明)。
在第二个例子中,你正在处理的触发的事实,构造函数是inline的一个怪癖。由于析构函数非纯虚函数,定义是必需的。然而,未能检测到的错误,这就是为什么代码似乎可以在的,但是从C ++的角度来看这个例子是为打破作为优先个整整的原因的细节挖掘这种行为的原因。
这些都不是程序,但(或者甚至将DLL)。当你得到的错误,你实际上得到帮助.x是没有的〜X中的定义()
全部是这种情况下需要的情况下它的定义。即使它不会做任何事情。
在回答优先个问题,
什么是无法解析的外部中
时,析构函数是虚拟的连接器
或当。构造函数是不是inline?
...其实很简单,你没有析构函数的定义。
现在你的第二个问题更有意思:
为什么我没有得到一个悬而未决
外部如果我做了析构函数
非虚,还是我的inline
构造函数?
而原因就是没必要X的析构函数,因为你永远不会实例化X,所以它扔了全班的路程。如果您尝试这个程序,你会得到一个无法解析的外部:
X::X() {};
int main()
但是,如果你出X它就好了,正如你所观察到的。
现在,让我们回身边,为什么它赢得了“如果,如果析构函数virtual。我猜测这里,但我相信原因是因为你有一个虚析构函数,X现在是一个多态类。以奠定出多态类的编译器,一个虚函数表需要的不会忽略每一个虚函数。你有没有X::~X,所以无法解析的外部效果。
为什么不随便扔X离开时那样X是不是多态类?更多猜测这里。但我希望的理由是,即使你没有直接实例化X,它不能确保无处在你的代码做一个X生活,masqerading为别的。举一个例子,考虑一个抽象基类。在这种情况下,你将永远不会实例化Base直接与该代码Derived可能是在一个完全独立的翻译单元。所以,当到达此多态类,它不能放弃它,即使它不知道你实例化它。
我就这一个,这是定义的行为的嫌疑。这里的原因
$ 10.3/8-“虚函数声明
在一个类必须被定义,或
宣纯(10.4)在类或
这两个,但没有诊断是必需的
(3.2)“。
GCC给出了错误,如下面的,而这又是高度暗示(至少)关于虚函数的一个非标准的细节
/在函数X::X()': prog.cpp:(.text+0x6):
undefined reference to虚表X'
/在函数X::X()': prog.cpp:(.text+0x16):
undefined reference to虚表X'
collect2的:LD返回1退出
我如果诊断确实来自于操作码需要我,所以想到这个发帖的,像我adventuredownvotes :)。当然,要我猜。
你需要给身体的虚析构函数:
virtual ~X() {}
你可以用这个越来越远两个构造和destr是私有的-如果没有其他裁判类X的构建则可能会推断是不需要的destr,所以缺乏一个定义是根本不算什么。
这并不能解释为什么情况1出现故障,而2和3的构建确定,但。不知道如果两者都公开会发生什么?
本文标题 :为什么这个虚析构函数触发一个无法解析的外部?
本文地址 :CodeGo.net/189883/
Copyright (C) 2014 CodeGo.net关于各种无法解析的外部符号问题的相应解决方案
在使用vs2008调试程序的过程中,经常会出现无法解析的外部符号问题,可能的原因有很多种,下面这些是我一年来积累的经验.
考虑可能的原因:[0]出现无法解析可能是因为lib文件不正确,比如64位的编译配置,结果使用的是32位的lib包.[1]只写了类声明,但还没有写实现类,造成调用时无法解析[2]声明和定义没有统一,造成链接不一致,无法解析[3]没有在项目属性页的链接器的命令行选项加入相应的类包。[4]没有在c++包含目录和库目录加入相应的类包路径[5]在测试工程中被测文件目录可能需要包含被测类的cpp定义文件[6]ICE接口测试时,无法解析可能因为被测文件没有包含进相关的cpp文件,另外,在TestSuite_ProjectRun.h文件中需要包含IProjectRun.h头文件,及相关的头文件(举例)。
[7]import相关的无法解析内容,解决办法是在链接器的依赖项中加入相应的动态库
[8]出现如下错误的原因一般是动态库没有包进来。__impProjectRun.obj : error LNK2019: 无法解析的外部符号 __imp__StartHistoryLocalModule,该符号在函数 "protected: virtual int __thiscall HiRTDB::CProjectRun::DoStart(void)" (@HiRTDB@@MAEHXZ) 中被引用
[9]error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW工程属性,C/C++,代码生成,运行时库选择MDd,
[9]无法解析的外部符号"__declspec(dllimport) public: int __thiscall HiRTDB::CTagTree::GetObjectA(int,struct HiRTDB::SBaseReadProps const &,struct HiRTDB::SBaseReadValues &)" (@HiRTDB@@@@@Z),该符号在函数"public: int __thiscall HiRTDB::CStringImpl::Get(int,struct HiRTDB::SStringReadProps const &,struct HiRTDB::SStringReadValues &)" (@HiRTDB@@@@@Z) 中被引用
原因可能是工程配置文件中有多余选项,请参考其他模块的配置选项,不要有多余配置。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
转自:http://blog.csdn.net/enotswn/article/details/5934938 考虑可能的原因:[0]出现无法解析可能是因为lib文件不正确,比如64位的编译配置,结果使用的是32位的lib包.[1]只写了类声明,但还没有写实现类,造成调用时无法解析[2]声明和定义没有统一,造成链接不一致,无法解析[3]没有在项目属性页的链接 ...
最近在写与驱动程序通信的Windows应用程序,在VS2013编译时出现了“error LNK2019:无法解析的外部符号”的错误. 网上查了一下,搜到很多类似的情况,有很多解决方法,但是有些都行不通.回归错误本身,看到了“LNK”的字样,很有可能是某些库文件没有链接上. 再查看自己的程序源代码哪些符号没有解析,其中一个函数是SetupDiGetClassD ...
在VS中使用类模板出现出现LNK2019: 无法解析的外部符号错误,应在一个.h文件中完成方法的声明与实现,不要将实现放在cpp文件里,VS貌似不支持类模板分离
据我所知,在使用OCI连接Oracle时出现LNK2019: 无法解析的外部符号问题的情况有两种: 一.没有引入附加依赖项,右键项目-&属性-&配置属性-&链接器-&输入中添加oraocci11.lib(视数据库版本而定).或在程序之中添加 #pragma comment(lib , &oraocci11.lib& ...
环境:Windows 下 OpenGL ,Used in VS2013 前言:刚接触 OpenGL 的人,第一件事当然就是配置环境,说起配置环境 OpenGL 和 DirectX 相差不多,同时也基本报了一个相近的错误,见正文 问题:由于是刚刚接触 OpenGL,基本的东西也不知道,文章结尾留了一个问题,求解答!谢谢! 代码如下: #include & ...
error LNK2001: 无法解析的外部符号
这个错误一般主要原因是:只在头文件中有定义,没有在cpp文件中实现.导致这个原因一般是在添加库文件的时候,仅仅只是包含了他的头文件,因此解决办法就是也应该要包含它的实现文件,如果没有.cpp文件,那么就应该是静态文件或者动态文件.只要添加了这个基本上就没问题了.
错误信息: error LNK2019: 无法解析的外部符号 &public: void __thiscall CArcBall::setBounds(int,int)& (@@),该符号在函数 &public: void __thiscall CChild3DView::O ...
一,问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 ,该符号在函数 ___tmainCRTStartup 中被引用 Debug\jk.exe : fatal error LNK1120: 1 个无法解析的外部命令 error LNK2001: unresolved ext ...

我要回帖

更多关于 vc无法解析的外部符号 的文章

 

随机推荐