错误LNK2019未解析的外部符号_main在函数“int __cdecl invoke_main(void)”中引用(?invoke_main @@ YAHXZ)

时间:2015-10-28 20:14:53

标签: c++

严重级代码描述项目文件行错误LNK2019未解析的外部符号_main在函数“int __cdecl invoke_main(void)”中引用(?invoke_main @@ YAHXZ) 严重性代码描述项目文件行 错误LNK1120 1未解析的外部

   #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;
}

20 个答案:

答案 0 :(得分:18)

检查项目配置。 链接器 - &gt; 系统 - &gt; 子系统应为 Windows

答案 1 :(得分:13)

如果您使用CMake,则必须在add_executable

中设置 WIN32 标记
add_executable(${name} WIN32 ${source_files})

有关详细信息,请参阅CMake Doc

答案 2 :(得分:7)

我也遇到了同样的问题,我发现我选择了“新的Win32应用程序”而不是“新的Win32控制台应用程序”。切换时问题解决了。希望这可以帮到你。

答案 3 :(得分:4)

当我尝试从没有main()方法的程序创建可执行文件时,我遇到了同样的问题。当我包括像这样的样本main()方法

int main(){
  return 0;
}

解决了

答案 4 :(得分:2)

与@仲耀晖类似,我为dll配置了错误的应用程序类型。我想由于一些糟糕的拷贝粘贴而改变了项目类型,正如@Daniel Struhl建议的那样。

如何验证: 右键单击项目 - &gt; properties - &gt; Configuration Properties - &gt; General - &gt; Project Defaults - &gt; Configuration Type

检查此字段是否包含正确的类型,例如“动态库(.dll)”,以防项目为dll。

答案 5 :(得分:2)

右键单击项目。属性 - &gt;配置属性 - &gt;通用 - >链接器。

我发现需要设置两个选项。 在System:SubSystem = Windows(/ SUBSYSTEM:WINDOWS)下 在高级:EntryPoint = main

答案 6 :(得分:2)

选择项目。属性->配置属性->链接器->系统。

通过设置以下选项解决了我的问题。 在系统下:子系统=控制台(/ SUBSYSTEM:CONSOLE)

或者您可以选择最后一个选项作为“来自父辈的继承人”。

答案 7 :(得分:1)

这是一个边缘情况,但如果使用CMake构建MFC应用程序,也可能会出现此错误。

在这种情况下,您需要添加以下定义:

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

如果使用unicode进行编译,还需要添加以下属性:

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

答案 8 :(得分:1)

只需添加:

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

您的项目,一切都会正常 原因是由于Visual Studio试图找到启动项目的主要功能而没有找到

答案 9 :(得分:1)

我必须在Windows服务应用程序中#include 。 我将其保留为Windows控制台类型子系统。 “字符集”设置为UNICODE。

答案 10 :(得分:0)

我想开始使用 SDL 库。在多次设置和检查包含和库路径后,我在这里找到了 Rinus Verdult 的答案。我在 #include 行之后添加了这一行并且它起作用了。

#define main main

我有 Visual Studio 2019,Windows 10 64 位。

答案 11 :(得分:0)

对我来说,将 .dll 文件添加到我的项目文件夹解决了这个错误。 但我又犯了另一个错误:“函数中引用的未解析的外部符号主要......”,我按照这个答案解决了这个问题。 https://stackoverflow.com/a/50087608/10903596 或简而言之在我的主文件或包含主函数的文件中添加 #define SDL_MAIN_HANDLED

答案 12 :(得分:0)

当我想将项目类型更改为静态库时,我删除了项目中带有 main() 函数的文件。

我忘记更改属性 -> 常规 -> 配置类型

来自

应用程序(.exe)

静态库 (.lib)

这也给了我同样的错误。

答案 13 :(得分:0)

我遇到了同样的错误,因为我使用模板名称从模板化类创建了一个新对象,而没有像这样明确指定类型:

int main()
{

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

正确的方法是确切指定T像这样:

int main()
{

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

答案 14 :(得分:0)

这对我有用:

(我没有足够的代表来嵌入图片-对此表示抱歉。)

我进入了Project-> Properties-> Linker-> System。

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

我的平台设置为Active(Win32),子系统为“ Windows”。 我正在制作一个控制台应用程序,所以将其设置为“ Console”。

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

然后,我将平台切换为“ x64”。

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

答案 15 :(得分:0)

如果它是Windows系统,则可能是因为您在64位PC中使用了32位Winpcap库,反之亦然。如果是64位PC,则将winpcap library and header packet.lib和wpcap.lib从winpcap / lib / x64复制到winpcap / lib目录,并覆盖现有的

答案 16 :(得分:0)

旧线程,但对我来说,当我将int main(void)重命名为int wmain(void)并从cmake的add_executable()中删除WIN23时,它开始工作(遵循上述所有建议)。

答案 17 :(得分:0)

对我来说解决方案是:我同时清洗解决方案和项目。然后重新构建项目。 发生此错误的原因是,我尝试删除先前版本中的主文件(仅保留库文件),因此在当前版本中,旧内容仍保留在生成的目录中。这就是未解决的事情发生的原因。 “在函数” int __cdecl invoke_main(void)“中引用的未解析的外部符号_main(?invoke_main @@ YAHXZ)”

答案 18 :(得分:0)

或只使用main()而不是WinMain

答案 19 :(得分:-1)

问题可能源自SDL_main.h中的宏指令

在该宏中,您的main(){}重命名为SDL_main(){},因为SDL在其支持的许多平台上都需要自己的main(){},因此它们会更改您的平台。大多数情况下,它可以实现他们的目标,但是在我的平台上,它创造了问题,而不是解决问题。我在SDL_main.h中添加了第二行,对我来说所有问题都消失了。

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

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

如果您不喜欢这两行引起的编译器警告,请注释掉这两行。

如果您的代码在WinApp(){}中,则完全没有此问题。仅当您的主要代码位于main(){}中并且您的平台类似于我的平台时,此答案才有帮助。

我有:Visual Studio 2019,Windows 10,x64,编写了一个32位控制台应用程序,该教程使用SDL2.0作为教程的一部分来打开窗口。