2013-06-17 5 views
0

이 오류를 해결하기 위해 이미 2 시간 씩 인터넷을 검색하여 많은 사람들이이 오류를 발견했지만 내 자신의 경우에 대한 해결책을 아직 찾지 못했습니다.LNK2019 : 해결되지 않은 외부 기호 _WinMain @ 16이 함수에서 참조했습니다. ___tmainCRTStartup

대개의 경우 솔루션은 솔루션의 속성 (콘솔 또는 Windows)에서 서브 시스템을 적절한 옵션으로 변경하는 것입니다. 하지만 내 것은 창문에 맞춰져 있는데, 내 경우에는 맞는 창문입니다. 내가 파일> 새로 만들기> 프로젝트> Win32 프로젝트> (선택) Windows 응용 프로그램> 사용이 솔루션을 생성 할 때 (체크)

내 문자 세트가 나는 기본적 생각 유니 코드로 설정

빈 프로젝트. 정보가 여전히 문의하시기 바랍니다 필요가있는 경우

감사

#include <Windows.h> 
#include <windowsx.h> 
#include <comdef.h> 
#include <DxErr.h> 

#pragma comment (lib, "DxErr.lib") 

void CheckForDxError(const char *file, int line, HRESULT hr) 
{ 
    if (!FAILED(hr)) 
     return; 

    // Get the direct X error and description 
    char desc[1024]; 
    sprintf(desc, "(DX) %s - %s" , DXGetErrorString(hr), DXGetErrorDescription(hr)); 

    // Output the file and line number in the correct format + the above DX error 
    char buf[4096]; 
    sprintf(buf, "%s(%d) : Error: %s\n", file, line, desc); 

    OutputDebugStringA(buf); 

    // Cause the debugger to break here so we can fix the problem 
    DebugBreak(); 
} 

:

// STANDARD WINDOWS HEADERS 
#include <windows.h> 
#include <windowsx.h> 
#include <stdio.h> 
#include <atlbase.h> 

// D3D9 HEADERS 
#include <d3d9.h> 

// USER MADE HEADERS 
#include "errorhelper.h" 

#pragma comment (lib, "d3d9.lib") 
#pragma comment (lib, "DxErr.lib") 

// GLOBALS 
CComPtr<IDirect3D9>     d3d; 
CComPtr<IDirect3DDevice9>   d3ddev; 
CComPtr<IDirect3DVertexBuffer9>  vbuffer; 
CComPtr<IDirect3DIndexBuffer9>  ibuffer; 

namespace GameEngine 
{ 
    // define the windowed resolution 
    #define SCREEN_WIDTH 1280        // horizontal resolution 
    #define SCREEN_HEIGHT 720         // vertical resolution 
    #define CheckHr(hr) CheckForDxError(__FILE__,__LINE__,hr) 
    #define D3DFVF_VERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) 

    struct VERTEX 
    { 
     FLOAT x, y, z, rhw; 
     DWORD color; 
    }; 

    //----------------------------------------------------------------------------- 
    // Name: InitVB() 
    // Desc: Initializes the vertex buffer 
    //----------------------------------------------------------------------------- 
    void InitVB() 
    { 
     VERTEX vertices[] = 
     { 
      {0.0f, 0.0f, 0.0f, 1.0f, 0xffffffff}, 
      {10.0f, 0.0f, 0.0f, 1.0f, 0xffffffff}, 
      {10.0f, 10.0f, 0.0f, 1.0f, 0xffffffff}, 
      {0.0f, 10.0f, 0.0f, 1.0f, 0xffffffff}, 
     };  
     CheckHr(d3ddev->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_VERTEX, D3DPOOL_DEFAULT, &vbuffer, NULL)); 
     void* pvertices; 
     CheckHr(vbuffer->Lock(0, sizeof(vertices), (void**) &pvertices, 0)); 
     memcpy(pvertices, vertices, sizeof(vertices)); 
     CheckHr(vbuffer->Unlock()); 
    } 

    //----------------------------------------------------------------------------- 
    // Name: InitIB() 
    // Desc: Initializes the index buffer 
    //---------------------------------------------------------------------------- 
    void InitIB() 
    { 
     short indices[] = 
     { 
      0, 1, 2, 
      2, 3, 0 
     }; 
     CheckHr(d3ddev->CreateIndexBuffer(sizeof(indices), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &ibuffer, NULL)); 
     void* pindices; 
     CheckHr(ibuffer->Lock(0, sizeof(indices), (void**) &pindices, 0)); 
     memcpy(pindices, indices, sizeof(indices)); 
     CheckHr(ibuffer->Unlock()); 
    } 

    //----------------------------------------------------------------------------- 
    // Name: Render() 
    // Desc: Draws the scene 
    //----------------------------------------------------------------------------- 
    void Render() 
    { 
     if(d3ddev == NULL) 
      return; 

     CheckHr(d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0)); 

     CheckHr(d3ddev->BeginScene()); 

     CheckHr(d3ddev->SetStreamSource(0, vbuffer, 0, sizeof(VERTEX))); 
     CheckHr(d3ddev->SetIndices(ibuffer)); 
     CheckHr(d3ddev->SetFVF(D3DFVF_VERTEX)); 

     CheckHr(d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2)); 

     CheckHr(d3ddev->EndScene()); 

     CheckHr(d3ddev->Present(NULL, NULL, NULL, NULL)); 
    } 

    //----------------------------------------------------------------------------- 
    // Name: InitD3D() 
    // Desc: Initializes Direct3D 
    //----------------------------------------------------------------------------- 
    void InitD3D(HWND hWnd) 
    { 
     // Create the d3d object 
     d3d.Attach(::Direct3DCreate9(D3D_SDK_VERSION)); 
     if(NULL == d3d) 
      throw("Failed to create Direct3D object"); 

     // Set the device settings 
     D3DPRESENT_PARAMETERS d3dpp; 
     ZeroMemory(&d3dpp, sizeof(d3dpp)); 
     d3dpp.BackBufferWidth = SCREEN_WIDTH;     // width of back buffer 
     d3dpp.BackBufferHeight = SCREEN_HEIGHT;     // height of the back buffer 
     d3dpp.BackBufferCount = 1;        // number of back buffers 
     d3dpp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;  // MSAA (anti-alia, number of samples 
     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // how to swap the front and back buffer 
     d3dpp.hDeviceWindow = hWnd;        // handle to the window 
     d3dpp.Windowed = TRUE;         // fullscreen/windowed 

     // Create the device 
     CheckHr(d3d->CreateDevice(D3DADAPTER_DEFAULT, 
             D3DDEVTYPE_HAL, 
             hWnd, 
             D3DCREATE_HARDWARE_VERTEXPROCESSING, 
             &d3dpp, &d3ddev)); 
    } 

    //----------------------------------------------------------------------------- 
    // Name: Cleanup() 
    // Desc: Releases all previously initialized objects 
    //----------------------------------------------------------------------------- 
    void Cleanup() 
    { 
     d3d = 0; 
     d3ddev = 0; 
     vbuffer = 0; 
     ibuffer = 0; 
    } 

    //----------------------------------------------------------------------------- 
    // Name: WindowProc() 
    // Desc: The window's message handler 
    //----------------------------------------------------------------------------- 
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
    { 
     switch(msg) 
     { 
      // the message that is sent when you click on the red x 
      case WM_DESTROY: 
       Cleanup(); 
       PostQuitMessage(0); 
       return 0; 

      case WM_PAINT: 
       Render(); 
       ValidateRect(hWnd, NULL); 
       return 0; 
     } 

     return DefWindowProc(hWnd, msg, wParam, lParam); 
    } 

    //----------------------------------------------------------------------------- 
    // Name: WinMain() 
    // Desc: The application's entry point 
    //----------------------------------------------------------------------------- 
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
    { 
     // Create the window class 
     WNDCLASSEX wc; 
     ZeroMemory(&wc, sizeof(WNDCLASSEX)); 
     wc.cbSize   = sizeof(WNDCLASSEX);   
     wc.style   = CS_HREDRAW | CS_VREDRAW;  
     wc.lpfnWndProc  = WindowProc;     
     wc.hInstance  = hInstance;      
     wc.hCursor   = LoadCursor(NULL, IDC_ARROW); 
     wc.hbrBackground = (HBRUSH)COLOR_WINDOW;   
     wc.lpszClassName = L"WindowClass1";    

     // Register the window class 
     RegisterClassEx(&wc); 

     // Calculate the neede window size 
     RECT ws = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};   
     AdjustWindowRect(&ws, WS_OVERLAPPEDWINDOW, FALSE); 

     // Ceate the window 
     HWND hWnd = CreateWindowEx(NULL, L"WindowClass1", L"Game Engine", WS_OVERLAPPEDWINDOW, 
            300, 300, ws.right - ws.left, ws.bottom - ws.top, 
            NULL, NULL, hInstance, NULL);  
     // Initialize Direct3D 
     InitD3D(hWnd); 

     InitVB(); 
     InitIB(); 

     // Show the window 
     ShowWindow(hWnd, nCmdShow); 

     // The message loop. 
     MSG msg; 
     while(GetMessage(&msg, NULL, 0, 0)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 


     UnregisterClass(L"WindowClass1", hInstance); 
     return 0; 
    } 
} 

그리고 errorhelper.h :

내 코드, MAIN.CPP입니다
+0

원본 파일이 둘 이상 있다고 생각하지 않거나 주 파일이 프로젝트에 없다고 가정합니다. – chris

+0

사실 프로젝트에있는 소스 파일 (main.cpp)이 하나뿐입니다. – Jvlonden

답변

1

WinMain을 C++ 네임 스페이스에 넣습니다. WinMain()은 응용 프로그램 네임 스페이스가 아닌 전역 네임 스페이스에서 자유 함수 여야합니다.

+0

감사! 그게 효과가 있었어. – Jvlonden