MFC 在类中声明其他类的静态对象出现的问题ATPC.obj : error LNK2001 和&nbs

原创 2013年12月02日 14:36:52

在一个类中有一个表态成员,但出现连接错误
#pragma once
#include "afx.h"

class CLogProcedure
{
 public:
  CLogProcedure(void);
  ~CLogProcedure(void);
  static voidCreateLogFile();
  static void LogWriteFile( DWORDdwErrorLevel, LPCTSTR lpOutputString, LPCTSTR lpfunc, INT iline);
  
  enum E_LOG_OUTPUT_LEVEL
  {
   E_LOGLEVEL_FAILED= -1 ,
   E_LOGLEVEL_INFORMATION= 0 ,
   E_LOGLEVEL_SUCCEEDED= 1
  };

 private:
  static CStdioFile m_plogFile;//出现问题的语句

};

出现的错误为:
Linking...
MY.obj error LNK2001: unresolved external symbol "private: static class CStdioFile  CMY::m_myFile" (?m_myFile@CMY@@0VCStdioFile@@A)
Debug/test1.exe fatal error LNK1120: unresolved externals
Error executing link.exe.

test1.exe error(s), warning(s)

(1)开始以为是无法使用动态连接库的问题,改为静态连接库,问题依旧
(2)把构造函数改为inline 连接通过,但类无法实例化,如CMY myTest;就又出现上面的错误
(3)把m_plogFile改为非静态成员,可以解决,但是这不是我想要的答案
出现这样的问题主要有一下几个:

1、缺少相关的头文件或者库

2、那就是类头文件中声明的函数在.cpp中没有实现

3、还可能就是类中可能定义其他类的静态对象,但是没在相应的CPP文件中进行初始化

 

解决方案:
使用静态成员类要初始化的
是在CPP文件中加上一句
static CMY::m_plogFile;

为什么添加呢?

解释如下:

为什么要在.cpp文件中加上
CStdioFile CMY::m_plogFile;

原因如下:
.h文件只是类声明的地方. 所以.h文件它不会也不能产生.obj文件
象你这样的static类成员变量它是全局的, 因此它需要定义,需要赋初值,需要分配全局内存,这样就必须在.cpp文件中添上该语句.


试想, 假如static类成员变量是一个对象的话, 如:CStdioFile. 它还需要执行构造函数.假如在.cpp文件中不初始化, 构造函数在哪执行呢?

 

相关文章推荐

VC里遇到这类问题原因:error LNK2001: unresolved external symbol __endthreadex

 error LNK2001: unresolved external symbol __endthreadex   error LNK2001: unresolved external symbol...

LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main错误的解决

最近写一个ATL的项目,最终realease的时候出现了这个问题,当时吓了一跳,后来发现了问题,代码没有错误是配置搞错了,因为debug没有任何问题。 出错原因:使用了CRT函数,这些函数需要CRT...
  • weuro
  • weuro
  • 2012年01月18日 10:50
  • 680

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 在创建MFC项目时,如果没有设置好项目...

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol

学习VC++时经常会遇到链接错误LNK2001,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。产生LNK2001错误的原因:一个是由于...

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol(转)

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol(转) 学习VC++时经常会遇到链接错误LNK2001,而一般说来...
  • xywlzd
  • xywlzd
  • 2012年09月28日 16:48
  • 428

c++ 模板 声明与实现分开编写(error LNK2001: unresolved external symbol...)

对于所有的喜欢把声明和定义分开放的C++er,在写模板时要把它俩放在一起一定感到十分郁闷,于是我本着非要棒打鸳鸯的倾向,找到了几种“棒”~   欢迎各位完善棒打鸳鸯技巧~ 1.在模板的声明文件(.h...

error LNK2001 无法解析的外部符号 "public: virtual bool __thiscall 问题解决办法

错误 18 error LNK1120: 17 个无法解析的外部命令 C:\Users\Administrator\Desktop\OPENCV\重新生成traincascade\Debug\test...

error LNK2001 一些问题

信息来着网络.........  可能成因1. 第一类:  例如,你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain。或者,你用vc打开了一个.c/.cpp 文件,然后...

error LNK2001 与 RUNTIME_CLASS 的问题解决

在使用RUNTIME_CLASS 时,产生error LNK2001的错误。非常纳闷。 检索到一篇文章http://blog.csdn.net/BeyondHaven/archive/2010/11/...
  • evan369
  • evan369
  • 2011年06月20日 14:30
  • 947

问题解决:继承抽象类时出现error LINK2001 无法解析的外部符号

在编程练习中使用一个抽象类,然后通过一个类说明来继承抽象类并实现抽象类的所有成员函数。根据编程习惯,我们会在.h文件中给出函数声明,在.cpp中给出各成员函数的具体实现,在编译时出现:error LI...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 在类中声明其他类的静态对象出现的问题ATPC.obj : error LNK2001 和&nbs
举报原因:
原因补充:

(最多只允许输入30个字)