如何解决连接异常(求通用的解决思路)
怎么解决连接错误(求通用的解决思路)?
1>CView.obj : error LNK2001: 无法解析的外部符号 "public: static class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > * CFrameWindowWnd::WindowClassName" (?WindowClassName@CFrameWindowWnd@@2PAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)
这是本次编程中遇到的一个连接错误,“无法解析的外部符号”本身很好理解,不过难以理解的是后面说的是什么。仔细看了一下,括号之前的算是看懂了:
看懂这堆东西之后我就去找相关的代码,首先是定义:
然后是对这个变量的调用:
有些声明就略了。当时候看到上面的调用好像懂了,将“::”改为了“.”,但是编译都出错了,说“.”之前要有;,那很明显不对,再看一下MSDN的static的说明:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(STATIC);k(DevLang-%22C%2B%2B%22)&rd=true
下面例子Example(例子)中有三个框,看了第二个框的代码之后发现我好像没写错

但是就是出现连接错误。
现在问题来了,错误提示括号里的这堆东西 (?WindowClassName@CFrameWindowWnd@@2PAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)到底在说什么?能给我带来有用的信息吗?
------解决方案--------------------
CFrameWindowWnd::WindowClassName
就是说你这个符号没有实现.
静态变量要在类体外定义(实现), 你在类中的部分,只是对它进行了声明而以.
即在.cpp文件中要所有函数体外写下面一句:
wstring CFrameWindowWnd::WindowClassName;
一般连接错误就三种解决方案:
1. 它提示的那个函数你真的没有实现. 或者因为写错了, 导致编译器认为你没有实现.
2. 如果符号是在某个cpp文件中定义的, 则可能是 没有把符号所在的cpp添加进工程.
3. 如果符号在库中, 则可能是没有把lib文件引用到工程中.
一般解决错误的顺序是从上到下, 因为第一个错误可能导致编译器误报接下来的N个错.
对你的错误, 就是
------解决方案--------------------
括号内应该是函数的真正的名字,也就是经过编译器Name Mangling后的名字。
1>CView.obj : error LNK2001: 无法解析的外部符号 "public: static class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > * CFrameWindowWnd::WindowClassName" (?WindowClassName@CFrameWindowWnd@@2PAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)
这是本次编程中遇到的一个连接错误,“无法解析的外部符号”本身很好理解,不过难以理解的是后面说的是什么。仔细看了一下,括号之前的算是看懂了:
public: static class
std::basic_string <wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >
// wchar_t作为模板参数实例化的basic_string类,即STL中的wstring类
* CFrameWindowWnd::WindowClassName
// CFrameWindowWnd类里的WindowClassName(实际上这是一个类里的静态变量)
看懂这堆东西之后我就去找相关的代码,首先是定义:
class CFrameWindowWnd : public CWindowWnd, public INotifyUI
{
public:
static wstring *WindowClassName; // 静态的类名,所有窗口用同一个类名
};
然后是对这个变量的调用:
CFrameWindowWnd::WindowClassName = new wstring(szWindowClass);
有些声明就略了。当时候看到上面的调用好像懂了,将“::”改为了“.”,但是编译都出错了,说“.”之前要有;,那很明显不对,再看一下MSDN的static的说明:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(STATIC);k(DevLang-%22C%2B%2B%22)&rd=true
下面例子Example(例子)中有三个框,看了第二个框的代码之后发现我好像没写错
但是就是出现连接错误。
现在问题来了,错误提示括号里的这堆东西 (?WindowClassName@CFrameWindowWnd@@2PAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)到底在说什么?能给我带来有用的信息吗?
------解决方案--------------------
CFrameWindowWnd::WindowClassName
就是说你这个符号没有实现.
静态变量要在类体外定义(实现), 你在类中的部分,只是对它进行了声明而以.
即在.cpp文件中要所有函数体外写下面一句:
wstring CFrameWindowWnd::WindowClassName;
一般连接错误就三种解决方案:
1. 它提示的那个函数你真的没有实现. 或者因为写错了, 导致编译器认为你没有实现.
2. 如果符号是在某个cpp文件中定义的, 则可能是 没有把符号所在的cpp添加进工程.
3. 如果符号在库中, 则可能是没有把lib文件引用到工程中.
一般解决错误的顺序是从上到下, 因为第一个错误可能导致编译器误报接下来的N个错.
对你的错误, 就是
------解决方案--------------------
括号内应该是函数的真正的名字,也就是经过编译器Name Mangling后的名字。