Thread: Error LNK2001

  1. #1
    Registered User
    Join Date
    Jul 2005
    Posts
    64

    Error LNK2001

    Hello,

    I am an ultra-novice windows programmer, so I'm sorry if this seems like a stupid question. Why am I getting an error when I type the code that follows?

    If you don't feel like reading the code, all I did (besides creating, registering, etc.. the window and creating the window function, both of which work) was include a header file "Clock.h" containing a class definition; in the main program, all I did was declare one object in the window function, and I got this error:

    unresolved external symbol: "public: __thiscall Clock::Clock(void)" (??0Clock@@QAE@XZ)

    It doesn't matter where in the program I declare the object, I get this error message (after linking). I can't see why.

    Many, MANY thanks in advance. You guys are a great help.

    --Bill

    Code:
    /* Process Mouse Messages. */
    
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    #include "Clock.h"
    
    LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
    
    char szWinName[] = "MyWin"; /* name of window class */
    
    char str[255] = ""; /* holds output string */
    
    MMRESULT begin = timeBeginPeriod(1);
    MMRESULT end = timeEndPeriod(2);
    
    DWORD start=timeGetTime();
    
    LONG xI=0;
    
    int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, 
                       LPSTR lpszArgs, int nWinMode)
    {
      HWND hwnd;
      MSG msg;
      WNDCLASSEX wcl;
      
      /* Define a window class. */
      wcl.cbSize = sizeof(WNDCLASSEX); 
    
      wcl.hInstance = hThisInst; /* handle to this instance */
      wcl.lpszClassName = szWinName; /* window class name */
      wcl.lpfnWndProc = WindowFunc; /* window function */
      wcl.style = 0; /* default style */
    
      wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* standard icon */
      wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); /* small icon */
      wcl.hCursor = LoadCursor(NULL, IDC_ARROW); /* cursor style */
    
      wcl.lpszMenuName = NULL; /* no main menu */
      wcl.cbClsExtra = 0; /* no extra */
      wcl.cbWndExtra = 0; /* information needed */
    
      /* Make the window white. */
      wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
    
      /* Register the window class. */
      if(!RegisterClassEx(&wcl)) return 0;
    
      /* Now that a window class has been registered, a window
         can be created. */
      hwnd = CreateWindow(
        szWinName, /* name of window class */
        "Processing Mouse Messages", /* title */
        WS_OVERLAPPEDWINDOW, /* window style - normal */
        CW_USEDEFAULT, /* X coordinate - let Windows decide */
        CW_USEDEFAULT, /* Y coordinate - let Windows decide */
        CW_USEDEFAULT, /* width - let Windows decide */
        CW_USEDEFAULT, /* height - let Windows decide */
        HWND_DESKTOP, /* no parent window */
        NULL, /* no menu */
        hThisInst, /* handle of this instance of the program */
        NULL /* no additional arguments */
      );
    
      /* Display the window. */
      ShowWindow(hwnd, nWinMode);
      UpdateWindow(hwnd);
    
      /* Create the message loop. */
      while(GetMessage(&msg, NULL, 0, 0))
      {
        TranslateMessage(&msg); /* translate keyboard messages */
        DispatchMessage(&msg); /* return control to Windows 98 */
      }
      return msg.wParam;
    }
    
    /* This function is called by Windows 98 and is passed 
       messages from the message queue.
    */
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
                                WPARAM wParam, LPARAM lParam)
    {
      HDC hdc;
      Clock timer;
      
      switch(message) {
        case WM_RBUTTONDOWN: /* process right button */
          hdc = GetDC(hwnd); /* get DC */
          sprintf(str, "Right button is down at %d, %d",
                  LOWORD(lParam), HIWORD(lParam));
          TextOut(hdc, LOWORD(lParam), HIWORD(lParam),
                  str, strlen(str));
          ReleaseDC(hwnd, hdc); /* Release DC */
          break;
        case WM_LBUTTONDOWN: /* process left button */
          hdc = GetDC(hwnd); /* get DC */
    	  TextOut(hdc, 10, 50, "Angular velocity is                                   ", 54);
    	  sprintf(str, "Time passed is %d pixels/sec", timeGetTime()-start);
    	  TextOut(hdc, 10, 50, str, strlen(str));
          ReleaseDC(hwnd, hdc); /* Release DC */
          break;
    	case WM_MOUSEMOVE:
    	  hdc = GetDC(hwnd);
      	  TextOut(hdc, 10, 50, "                                                 ", 49);
    	  sprintf(str, "Time passed is %d milliseconds", timeGetTime()-start);
    	  TextOut(hdc, 10, 50, str, strlen(str));
    	  TextOut(hdc, 10, 10, "Mouse coordinates are at                                   ", 59);
    	  sprintf(str, "Mouse coordinates are at (%d, %d)", LOWORD(lParam), HIWORD(lParam));
    	  TextOut(hdc, 10, 10, str, strlen(str));
    	  ReleaseDC(hwnd,hdc);
    	  break;
        case WM_DESTROY: /* terminate the program */
          PostQuitMessage(0);
          break;
        default:
           /* Let Windows 98 process any messages not specified in
             the preceding switch statement. */
          return DefWindowProc(hwnd, message, wParam, lParam);
      }
      return 0;
    }
    
    /* Clock class definition (FYI)
    class Clock
    {
    	private:
    		float timestarted;
    	public:
    		Clock();
    		VOID reset();
    		VOID wait(const float &tsec);
    		float time();
    };
    
    VOID Clock::reset()
    {
    	timestarted=timeGetTime();
    	return;
    }
    
    float Clock::time()
    {
    	return timeGetTime()-timestarted;
    }
    
    VOID wait(const float &tsec)
    {
    	DWORD beginning = timeGetTime();
    	while(beginning + tsec*1000 > timeGetTime())
    	{ /* wait */}
    	return;
    } */

  2. #2
    Registered User
    Join Date
    Jan 2005
    Posts
    847
    You've declared a constructor but haven't defined it. Either remove this line from the class defination
    Code:
    clock();
    or declare the constructor
    Code:
    clock::clock()
    {
    
    }

  3. #3
    Registered User
    Join Date
    Jul 2005
    Posts
    64
    Thanks a million. I can't believe it was that simple.

    --Bill

  4. #4
    Registered User
    Join Date
    Jul 2005
    Posts
    64
    Sorry to keep bothering, but there is another problem.

    Now that I got the program to work, when I declare an object and output object.time() onto the screen, it shows random numbers (big numbers, sometimes positive and sometimes negative). I am pretty sure it is because data members and member functions are defined as float; when I change them to DWORD or unsigned long, everything works fine. I want to convert them to float because it suits my needs better. Is there a way to do it?

    Thanks again for all your help. I really appreciate it.

    --Bill

Popular pages Recent additions subscribe to a feed