87

Error:

Severity Code Description Project File Line Error LNK2019 unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 
Severity    Code    Description Project File    Line
Error   LNK1120 1 unresolved externals  

Code:

#include "windows.h"
#include "tchar.h"
#include "d3d9.h"
#pragma comment(lib, "d3d9.lib")

LPDIRECT3D9 pDirect3D=NULL; 
LPDIRECT3DDEVICE9 pDirect3DDevice=NULL; 
const int segment = 50;
const int NV = segment*13;
struct CUSTOMVERTEX
{
   float x, y, z, rhv;
   
   DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

LPDIRECT3DVERTEXBUFFER9 pVertexBuffer=NULL; 

HRESULT InitialDirect3D(HWND hvnd)
{
   if((pDirect3D=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
      return E_FAIL;
   D3DDISPLAYMODE Display;

   if(FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
      return E_FAIL;

   D3DPRESENT_PARAMETERS Direct3DParameter;
   ZeroMemory(&Direct3DParameter, sizeof Direct3DParameter);
 
   Direct3DParameter.Windowed=TRUE;
   Direct3DParameter.SwapEffect=D3DSWAPEFFECT_DISCARD;
   Direct3DParameter.BackBufferFormat=Display.Format;

   if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hvnd,
                                     D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                     &Direct3DParameter, &pDirect3DDevice)))
      return E_FAIL;
   return S_OK;
}
HRESULT RenderingDirect3D()
{
   if(pDirect3DDevice==NULL)
      return E_FAIL;
   pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(90, 150, 100), 1.f, 0);
   
   pDirect3DDevice->BeginScene();

   pDirect3DDevice->SetStreamSource(0, pVertexBuffer, 0, sizeof(CUSTOMVERTEX));
  
   pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);   

    pDirect3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, NV);
    pDirect3DDevice->EndScene();

   pDirect3DDevice->Present(NULL, NULL, NULL, NULL);

   return S_OK;
}

void DeleteDirect3D()
{
   if(pVertexBuffer)
       pVertexBuffer->Release();
   if(pDirect3DDevice)
       pDirect3DDevice->Release();
   if(pDirect3D)
       pDirect3D->Release();
}

HRESULT InitialVertexBuffer()
{
    float u = 0.0;
    int z = 0;
    float points[][2] = {
        {150,150},
        {125,100},
        {150,50},
        {200,50},
        {225,55},
        {285,60},
        {325,25},
        
        {342,30},
        {340,35},
        {340,40},
    
        {325,75},
        {300,125},
        {300,175},
        {305,250},
        {295,287},
        {257,347},
        {200,350},
        {150,325},
        {140,290},

        {142,282},
        {160,280},
        {165,286},
        
        {175,325},
        {215,340},
        {250,335},
        {275,300},
        {275,250},
        {255,200},
        {250,150},
        {275,100},
        {305,65},
        
        {275,85},
        {240,95},
        {215,85},
        {170,65},
        {140,90},
        {160,135},

        {160,150},
        {152.5,150},
        {150,150}
    };
        
    CUSTOMVERTEX Vertexes[NV*2];
    int i = 0;
    while( i < NV*2 )
    {
        u = 0.f;
        for(int j = 0; j < segment; j++)
        {
            Vertexes[i].x = (1-3*u+3*u*u-u*u*u)*points[z][0]+(3*u-6*u*u+3*u*u*u)*points[z+1][0]+(3*u*u-3*u*u*u)*points[z+2][0]+(u*u*u)*points[z+3][0];
            Vertexes[i].y = (1-3*u+3*u*u-u*u*u)*points[z][1]+(3*u-6*u*u+3*u*u*u)*points[z+1][1]+(3*u*u-3*u*u*u)*points[z+2][1]+(u*u*u)*points[z+3][1];
            Vertexes[i].z = 0.5f;
            Vertexes[i].color = 0x00ffffff;
            Vertexes[i].rhv = 1.f;
            u += (float)1/segment;
            i++;
            Vertexes[i].x = (1-3*u+3*u*u-u*u*u)*points[z][0]+(3*u-6*u*u+3*u*u*u)*points[z+1][0]+(3*u*u-3*u*u*u)*points[z+2][0]+(u*u*u)*points[z+3][0];
            Vertexes[i].y = (1-3*u+3*u*u-u*u*u)*points[z][1]+(3*u-6*u*u+3*u*u*u)*points[z+1][1]+(3*u*u-3*u*u*u)*points[z+2][1]+(u*u*u)*points[z+3][1];
            Vertexes[i].z = 0.5f;
            Vertexes[i].color = 0x00ffffff;
            Vertexes[i].rhv = 1.f;
            i++;
        }
        z += 3;
    }
        if(FAILED(pDirect3DDevice->CreateVertexBuffer(NV*2*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
        D3DPOOL_DEFAULT, &pVertexBuffer, NULL)))
            return E_FAIL;
   
   void *pVB=NULL;
   if(FAILED(pVertexBuffer->Lock(0, sizeof Vertexes, (void**)&pVB, 0)))
      return E_FAIL;

   memcpy(pVB, Vertexes, sizeof Vertexes);
   
   pVertexBuffer->Unlock();
   
   return S_OK;
}

LRESULT CALLBACK MainWinProc(HWND hwnd, 
                             UINT msg,
                             WPARAM wparam, 
                             LPARAM lparam) 
{
   switch(msg)
   {
      case WM_PAINT:
            RenderingDirect3D();
            ValidateRect(hwnd, NULL);
            break;
      case WM_DESTROY:
            DeleteDirect3D();
            PostQuitMessage(0);
            return 0;
   }
   return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(HINSTANCE hinstance,
                   HINSTANCE hprevinstance,
                   LPSTR lpcmdline, 
                   int ncmdshow) 
{
   WNDCLASSEX windowsclass;
   HWND hwnd; 
   MSG msg; 
   //
   windowsclass.cbSize=sizeof(WNDCLASSEX);
   windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
   windowsclass.lpfnWndProc=MainWinProc;
   windowsclass.cbClsExtra=0;
   windowsclass.cbWndExtra=0;
   windowsclass.hInstance=hinstance;
   windowsclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
   windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
   windowsclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
   windowsclass.lpszMenuName=NULL;
   windowsclass.lpszClassName=_T("WINDOWSCLASS");
   windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
   
   if(!RegisterClassEx(&windowsclass))
      return 0;
   
   if(!(hwnd=CreateWindowEx(
      NULL,
      _T("WINDOWSCLASS"), 
      _T("Desenam litera G"), 
      WS_OVERLAPPEDWINDOW|WS_VISIBLE, 
      CW_USEDEFAULT, 0, 
      CW_USEDEFAULT, 0, 
      NULL, 
      NULL, 
      hinstance, 
      NULL))) 
      return 0;

   if(SUCCEEDED(InitialDirect3D(hwnd)))
   {
      if(SUCCEEDED(InitialVertexBuffer()))
      {
         ShowWindow(hwnd, SW_SHOWDEFAULT); 
         UpdateWindow(hwnd); 
         ZeroMemory(&msg, sizeof msg);
         while(msg.message!=WM_QUIT)
         {
            if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
               TranslateMessage(&msg);
               DispatchMessage(&msg);
            }
            else
               RenderingDirect3D();
         }
      }
   }

   return msg.wParam;
}
Olivia Stork
  • 4,660
  • 5
  • 27
  • 40
Marcel Ceban
  • 877
  • 1
  • 6
  • 5
  • 6
    Possible duplicate of [What is an undefined reference/unresolved external symbol error and how do I fix it?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Alan Stokes Oct 28 '15 at 20:18
  • 8
    When you created your project, did you select "new Win32 application" or "new Console Application"? My guess would be you have pasted a Win32 code into a Console project.. – Daniel Strul Oct 28 '15 at 20:26
  • 30
    Check project configuration. **Linker** -> **System** -> **SubSystem** should be **Windows** – Michael Nastenko May 03 '16 at 03:25
  • 1
    I am new to stackoverflow,have no right to comment you problem directly.So I say there. I try many method with no result,***restart computer problem dismiss!*** hope it can help you. – Chuanhang.gu Dec 06 '16 at 09:12
  • 1
    @MichaelNastenko your comment fixed it for me. Please make it an answer. – Ranveer Sep 06 '17 at 06:35

20 Answers20

174

Check project configuration. Linker->System->SubSystem should be Windows.

Machavity
  • 30,841
  • 27
  • 92
  • 100
Michael Nastenko
  • 2,785
  • 1
  • 10
  • 14
  • 19
    Please don't make more work for other people by vandalizing your posts. By posting on the Stack Exchange network, you've granted a non-revocable right, under the [CC BY-SA 3.0 license](//creativecommons.org/licenses/by-sa/3.0/), for Stack Exchange to distribute that content (i.e. regardless of your future choices). By Stack Exchange policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted. If you want to know more about deleting a post please see: [How does deleting work?](//meta.stackexchange.com/q/5221) – Machavity May 24 '20 at 01:37
64

If you use CMake you have to set WIN32 flag in add_executable

add_executable(${name} WIN32 ${source_files})

See CMake Doc for more information.

Hans One
  • 3,329
  • 27
  • 28
36

I had same Problem when i was trying to create executable from program that having no main() method. When i included sample main() method like this

int main(){
  return 0;
}

It solved

Ishara Madawa
  • 1,502
  • 2
  • 14
  • 27
Anand Kadhi
  • 1,790
  • 4
  • 27
  • 40
  • 1
    Coming from a C# background, I typed "Main" instead of "main". Which the compiler clearly did not recognize. – Divan Feb 26 '21 at 20:28
11

Right click on project. Properties->Configuration Properties->General->Linker.

I found two options needed to be set. Under System: SubSystem = Windows (/SUBSYSTEM:WINDOWS) Under Advanced: EntryPoint = main

Jeff Gros
  • 111
  • 1
  • 2
9

I faced the same problem too and I found out that I selected "new Win32 application" instead of "new Win32 console application". Problem solved when I switched. Hope this can help you.

Shining Zhong
  • 316
  • 1
  • 3
  • 10
  • an above answer says to set the subsystem to windows, you can do that instead of making a new project (as console applications have console as the subsystem) – Blenm Sep 16 '19 at 19:50
9

just add:

int main()
{
    //you can leave it empty
    return 0;
}

to your project and everything will work its causes because of visual studio try to find the main function to start the project and didn't found it

daniel
  • 559
  • 5
  • 6
7

Similar to @仲耀晖 I had the wrong application type configured for a dll. I guess that the project type changed due to some bad copy pasting, as @Daniel Struhl suggested.

How to verify: Right click on the project -> properties -> Configuration Properties -> General -> Project Defaults -> Configuration Type.

Check if this field contains the correct type, e.g. "Dynamic Library (.dll)" in case the project is a dll.

langlauf.io
  • 3,009
  • 2
  • 28
  • 45
7

This is an edge case, but you can also get this error if you are building an MFC application with CMake.

In that case, you need to add the following definitions:

ADD_DEFINITIONS(-D_AFXDLL) SET(CMAKE_MFC_FLAG 2) # or 1 if you are looking for the static library

If you are compiling with unicode, the following properties also need to be added:

set_target_properties(MyApp PROPERTIES COMPILE_DEFINITIONS _AFXDLL,_UNICODE,UNICODE,_BIND_TO_CURRENT_CRT_VERSION,_BIND_TO_CURRENT_MFC_VERSION LINK_FLAGS "/ENTRY:\"wWinMainCRTStartup\"" )

Soure: FAQ: How to use MFC with CMake

Nicolas Holthaus
  • 7,763
  • 4
  • 42
  • 97
5

Select the project. Properties->Configuration Properties->Linker->System.

My problem solved by setting below option. Under System: SubSystem = Console(/SUBSYSTEM:CONSOLE)

Or you can choose the last option as "inherite from the parent".

2

This worked for me:

(I don't have enough rep to embed pictures yet -- sorry about this.)

I went into Project --> Properties --> Linker --> System.

IMG: Located here, as of Dec 2019 Visual Studio for Windows

My platform was set to Active(Win32) with the Subsystem as "Windows". I was making a console app, so I set it to "Console".

IMG: Changing "Windows" --> "Console"

Then, I switched my platform to "x64".

IMG: Switched my platform from Active(32) to x64

Brian Tung
  • 742
  • 6
  • 7
  • Under windows 10, Visual studio 2019, in project, properties, switching from active(32) (x86) to x64 (and thus i needed to re-add the "include path" of my library, the "lib path" (in the linker path) and the name of library in the additionnal dependencies). The subsystem in linker/system was still "Console (/SUBSYSTEM:CONSOLE)" and it works well: i could rebuild the solution without the error. I thus believe (without to be absolutely sure) that the main change for me was x86 (32) to 64. Thus confirming the above comment. – Via_fx_24 Nov 28 '21 at 12:21
1

Solution for me is: I clean both the solution and the project. And just rebuild the project. This error happens because I tried to delete the main file (only keep library files) in the previous build so at the current build the old stuff is still kept in the built directory. That's why unresolved things happened. "unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) "

Karim
  • 252
  • 1
  • 4
  • 17
  • I just follow you. And it worked for me. Firstly, in Visual Studio, clean the solution. Second, just build the project "ALL_BUILD". I guess this project to build other projects (69 projects in my solution) in the specific order! Then all project built successfully. – ligand Apr 23 '22 at 03:34
1

I had to #include <tchar.h> in my windows service application. I left it as a windows console type subsystem. The "Character Set" was set to UNICODE.

Todd
  • 305
  • 2
  • 9
1

I deleted the file with main() function in my project when I wanted to change project type to static library.

I Forgot to change Properties -> General -> Configuration Type

from

Application(.exe)

to

Static Library (.lib)

This too gave me the same error.

0

Old thread but for me it started working (after following all advise above) when i renamed int main(void) to int wmain(void) and removed WIN23 from cmake's add_executable().

wvd_vegt
  • 326
  • 2
  • 5
0

If it is a windows system, then it may be because you are using 32 bit winpcap library in a 64 bit pc or vie versa. If it is a 64 bit pc then copy the winpcap library and header packet.lib and wpcap.lib from winpcap/lib/x64 to the winpcap/lib directory and overwrite the existing

  • This project isn't using WinPcap (or Npcap), so that's probably not the answer in this particular case. The problem in this case is probably that it's a Windows-subsystem program, given that it has a `WinMain()` main function, but is being linked as if it's a console-subsystem program, which is expected to have a `main()` or `main()` main function. – user12341203 Dec 08 '19 at 04:53
0

The problem might originate from a macro instruction in SDL_main.h

In that macro your main(){} is renamed to SDL_main(){} because SDL needs its own main(){} on some of the many platforms they support, so they change yours. Mostly it achieves their goal, but on my platform it created problems, rather than solved them. I added a 2nd line in SDL_main.h, and for me all problems were gone.

#define main SDL_main    //Original line. Renames main(){} to SDL_main(){}. 

#define main main        //Added line. Undo the renaming.

If you don't like the compiler warning caused by this pair of lines, comment both lines out.

If your code is in WinApp(){} you don't have this problem at all. This answer only might help if your main code is in main(){} and your platform is similar to mine.

I have: Visual Studio 2019, Windows 10, x64, writing a 32 bit console app that opens windows using SDL2.0 as part of a tutorial.

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
0

I got the same error because I created a new object from a templated class using the template name without specifying the type explicitly like this:

int main()
{

    MyClass<T> Test2(5.60, 6.6); <- This is wrong
           ^^^
    return 0;
}

The correct way to do it was to specify exactly what T was like this:

int main()
{

    MyClass<double> Test2(5.60, 6.6); <- This is right
            ^^^^^^
    return 0;
}
AdoobII
  • 249
  • 3
  • 11
0

for me adding .dll file to my project folder solved this error. but game me another error: "unresolved external symbol main referenced in function ..." and I solved this by following this answer. https://stackoverflow.com/a/50087608/10903596 or in short adding #define SDL_MAIN_HANDLED in my main file or file containing main function.

Bipin Maharjan
  • 423
  • 6
  • 13
0

You can get this error, if you have your main entry point enclosed in a namespace.

So, don't put your main entry point in a namespace, leave it at the global level.

James John McGuire 'Jahmic'
  • 11,728
  • 11
  • 67
  • 78
-1

I wanted to start working with SDL library. After setting and checking the include and library paths for numerous times, I came across the answer by Rinus Verdult here. I added this line after the #include lines and it worked.

#define main main

I have visual studio 2019, windows 10 64bit.

F14
  • 67
  • 2
  • 6
  • Good it works for you, but doing this kind of preprocessor trickery deteriorates code readability and it might be considered a bad practice. I'd either look for some other fix or at least elaborate why this particular way has been used. – alagner May 18 '21 at 10:29
  • @alanger You are right. This is not a good practice to follow especially if you want to make your code public. But, I've just started learning SDL and this kind of errors in the beginning can be very frustrating. So, it's essentially a workaround for now. – F14 May 24 '21 at 10:20