Архив метки: Visual Studio



Visual Studio: Ошибка unresolved external symbol _main

Рассматриваю пример кода на WinAPI:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
    return 0;
}

Если ничего не изменять, то в Visual Studio Community я получаю такое сообщение об ошибке:

Error (active) E0167 argument of type «const char *» is incompatible with parameter of type «LPCWSTR» Sample01 C:\Users\Denis\source\repos\WinAPI\Sample01\Start.cpp 6

 

Ладно, исправлю как нужно.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);
    return 0;
}

Теперь появляется ошибка при сборке проекта:

LNK2019 unresolved external symbol _main referenced in function «int __cdecl invoke_main(void)» (?invoke_main@@YAHXZ)

 

Чтобы исправить её, потребовалось изменить конфигурацию:
ProjectPropertiesConfiguration PropertiesLinkerSystemSubsystem
Здесь нужно сменить Console (/SUBSYSTEM.CONSOLE) на Windows (/SUBSYSTEM:WINDOWS)

Останется лишь Предупреждение такого типа:

Warning C28251 Inconsistent annotation for ‘WinMain’: this instance has no annotations. See c:\program files (x86)\windows kits\10\include\10.0.19041.0\um\winbase.h(1006). Sample01 C:\Users\Denis\source\repos\WinAPI\Sample01\Start.cpp 3

 

Его можно игнорировать. Но если вы хотите, чтобы не было даже предупреждений вида SAL Annotations, можно разнести переносы строк (хотя мне так не нравится):

#include <windows.h>

int WINAPI WinMain
(
    HINSTANCE _In_ hInstance,
    HINSTANCE _In_opt_ hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nCmdShow
)
{
    MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);
    return 0;
}
Отдельно сделаю примечание для компилятора MinGW-w64 — for 32 and 64 bit Windows (C++)
Здесь изначальный код работает, поэтому пришлось оставить его в таком виде:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
    return 0;
}