Я работал над прототипами приложения, использующего библиотеки SDL и winsock, когда внезапно столкнулся с этой ошибкой при компиляции:
LNK2019 неразрешенный внешний символ main, на который ссылается функция int __cdecl invoke_main (void) (? Invoke_main @@ YAHXZ)
Я попытался изменить параметр «Подсистема» на «Windows» и «Консоль» и т. Д., Но это привело только к той же ошибке с другим сообщением WinMain о неразрешенном внешнем символе. После некоторого исследования я прислушался к совету кого-то изменить основной на wmain и вуаля — приложение работало, как задумано.
Что меня интересует, так это то, что я не менял никаких настроек по умолчанию из Visual Studio, кроме стандарта C ++ (который я изменил с C ++ 11 на C ++ 17), и других моих проектов, в которых есть опция Use Unicode Character Set. включены, работают с обычной функцией main (). Так что именно заставляет меня использовать здесь wmain вместо обычного main?
Согласно эта страница официальная документация Microsoft, main
или wmain
должна использоваться для /SUBSYSTEM CONSOLE
и WinMain
или wWinMain
должна использоваться для /SUBSYSTEM WINDOWS
. — person emredesu schedule 01.11.2020
Я нахожу этот вопрос немного запутанным, но wmain
— это точка входа для консольных приложений Unicode. — person emredesu schedule 01.11.2020
Выложите пожалуйста код и настройки сборки. У SDL есть свои подходы к основному (SDL_main, SDL_MAIN_HANDLED, SDL_SetMainReady и т. Д.), И трудно угадать, какой из них вы используете. — person emredesu schedule 01.11.2020
Проблема была вызвана макросом SDL, который расширяет main до SDL_main. Решение заключалось в том, чтобы использовать
или используйте официальный способ SDL для отмены определения main. Использование wmain показалось, что проблема решена не из-за Unicode зависимости, но поскольку в SDL нет макроса для wmain.