title: Multiple destructor definition for no reason
body: <p>I have a project which I'm migrating from VC6 to VS2013. While I was building the project, I'm getting this error. </p>
  
  <blockquote>
    <p>error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)"
    (??1CMemDC@@UAE@XZ) already defined in GameBoard.obj</p>
  </blockquote>
  
  <p>Following are the files that might be creating this issue. </p>
  
  <p><strong>GameBoard.h</strong></p>
  
  <pre><code>#include "DirectSound.h"
  #include "MIDI.h"
  #include &lt;vector&gt;
  class CGameBoard : public CWnd
  {
      friend class CTetrisDlg;
      friend class COptionsDlg;
  
      DECLARE_DYNAMIC(CGameBoard);
  
  // Construction/Destruction
  public:
      CGameBoard();
      virtual ~CGameBoard();
  
  .......
  };
  </code></pre>
  
  <p><strong>GameBoard.cpp</strong> file has definition for this destructor.</p>
  
  <pre><code>#include "stdafx.h"
  #include "Tetris.h"
  #include "GameBoard.h"
  #include "Piece.h"
  #include "MemDC.h"
  #include "VolumeCtrl.h"
  
  #include &lt;stdlib.h&gt;
  #include &lt;time.h&gt;
  static CGameBoard * gpGameBoard;
  
  CGameBoard::CGameBoard()
  {
      m_pCurPiece = m_pNextPiece = 0;
      m_usLevel = 0;
      m_clrCurPiece = RGB(0,0,0);
      m_bShowGrid = TRUE;
      m_nSquareWidth = 14;
      m_nSquareHeight = 14;
      m_clrBackground = RGB(255, 255, 255);
      m_bExFigures = FALSE;
      m_pMusic = 0;
      m_uTimer = 0;
      m_dwVolume = 100;   // 100% music volume by default
  
      gpGameBoard = this;
  }
  
  CGameBoard::~CGameBoard()
  {
      if(m_pCurPiece)
          delete m_pCurPiece;
      if(m_pNextPiece)
          delete m_pNextPiece;
  
      if( m_pMusic )
          delete m_pMusic;
  
      gpGameBoard = 0;
  }
  </code></pre>
  
  <p>This destructor is defined only once in <code>GameBoard.cpp</code> and <code>GameBoard</code> is not included in any other <code>cpp</code> or <code>header file</code>. </p>
  
  <p><strong>MemDC.h</strong></p>
  
  <pre><code>#ifndef _MEMDC_H_
  #define _MEMDC_H_
  
  class CMemDC : public CDC {
  private:
      CBitmap m_bitmap;       // Offscreen bitmap
      CBitmap* m_oldBitmap;   // bitmap originally found in CMemDC
      CDC* m_pDC;             // Saves CDC passed in constructor
      CRect m_rect;           // Rectangle of drawing area.
      BOOL m_bMemDC;          // TRUE if CDC really is a Memory DC.
  
  public:
      CMemDC(CDC* pDC) : CDC(), m_oldBitmap(NULL), m_pDC(pDC)
      {
          ASSERT(m_pDC != NULL); // If you asserted here, you passed in a NULL CDC.
  
          m_bMemDC = !pDC-&gt;IsPrinting();
  
          if (m_bMemDC){
              // Create a Memory DC
              CreateCompatibleDC(pDC);
              pDC-&gt;GetClipBox(&amp;m_rect);
              m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
              m_oldBitmap = SelectObject(&amp;m_bitmap);
              SetWindowOrg(m_rect.left, m_rect.top);
          } else {
              // Make a copy of the relevent parts of the current DC for printing
              m_bPrinting = pDC-&gt;m_bPrinting;
              m_hDC = pDC-&gt;m_hDC;
              m_hAttribDC = pDC-&gt;m_hAttribDC;
          }
      }
  
      ~CMemDC()
      {
          if (m_bMemDC) {
              // Copy the offscreen bitmap onto the screen.
              m_pDC-&gt;BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
                              this, m_rect.left, m_rect.top, SRCCOPY);
              //Swap back the original bitmap.
              SelectObject(m_oldBitmap);
          } else {
              // All we need to do is replace the DC with an illegal value,
              // this keeps us from accidently deleting the handles associated with
              // the CDC that was passed to the constructor.
              m_hDC = m_hAttribDC = NULL;
          }
      }
  
      // Allow usage as a pointer
      CMemDC* operator-&gt;() {return this;}
  
      // Allow usage as a pointer
      operator CMemDC*() {return this;}
  };
  
  #endif
  </code></pre>
  
  <p>This problem is related to One Definition Rule which is defined <a href="https://en.wikipedia.org/wiki/One_Definition_Rule" rel="nofollow noreferrer">here</a>, but I'm not getting what to do. </p>
  
  <p>I have done some changes suggested <a href="https://support.microsoft.com/en-us/kb/148652" rel="nofollow noreferrer">here</a>. And now I'm getting following error. Any idea, pls?</p>
  
  <blockquote>
    <p>error LNK1181: cannot open input file 'Nafxcwd.lib Libcmtd.lib'</p>
  </blockquote>