LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup

У меня есть следующая ошибка LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup,

Есть много тем, связанных с этой ошибкой, но ни одно из этих решений не помогло мне. И никто не объяснил, почему эта ошибка здесь.

Я пытался:

не пробовал и подозреваю, что это тоже не сработает:

почему я получаю эту ошибку и какое решение?


person forest.peterson    schedule 28.06.2012    source источник
comment
У вас есть функция int main(char** argv, int argc)?   -  person Linuxios    schedule 28.06.2012
comment
@Linuxios, это int main(int argc, char** argv) (в вашем прототипе неверный порядок)   -  person BlakBat    schedule 28.06.2012
comment
@BlakBat: Спасибо. Прости. В любом случае, я даже не работаю в Windows, но везде такая подпись. Дох.   -  person Linuxios    schedule 28.06.2012


Ответы (12)


Какой у вас тип проекта? Если это «проект Win32», ваша точка входа должна быть (w)WinMain. Если это «Консольный проект Win32», то это должно быть (w)main. Имя _tmain #определяется как main или wmain в зависимости от того, определен ли UNICODE или нет.

Если это DLL, то DllMain.

Тип проекта можно увидеть в свойствах проекта, Linker, System, Subsystem. Будет написано либо «Консоль», либо «Windows».

Обратите внимание, что имя точки входа зависит от того, определен ли UNICODE или нет. В VS2008 он определен по умолчанию.

Правильным прототипом для main является либо

int _tmain(int argc, _TCHAR* argv[])

or

int _tmain()

Убедитесь, что это один из них.

РЕДАКТИРОВАТЬ:

Если вы получаете сообщение об ошибке _TCHAR, поместите

#include <tchar.h>

Если вы считаете, что проблема связана с одним из заголовков, перейдите к свойствам файла с помощью main() и в разделе «Препроцессор» включите создание предварительно обработанного файла. Затем скомпилируйте. Вы получите файл с тем же именем и расширением .i. Откройте его и посмотрите, не случилось ли что-нибудь неприятное с функцией main(). Теоретически могут быть мошеннические #define...

РЕДАКТИРОВАТЬ2:

При определении UNICODE (по умолчанию) компоновщик ожидает, что точкой входа будет wmain(), а не main(). Преимущество _tmain заключается в том, что он не зависит от UNICODE — он преобразуется либо в main, либо в wmain.

Некоторое время назад была причина поддерживать как сборку ANSI, так и сборку Unicode. Поддержка Unicode была крайне неполной в Windows 95/98/Me. Основными API были ANSI, и версии Unicode существовали тут и там, но не повсеместно. Кроме того, у отладчика VS возникли проблемы с отображением строк Unicode. В операционных системах с ядром NT (это Windows 2000/XP/Vista/7/8/10) поддержка Unicode является основной, а поверх нее добавляются функции ANSI. Поэтому, начиная с VS2005, по умолчанию при создании проекта используется Unicode. Это означает - wmain. Они не могут сохранить одно и то же имя точки входа, потому что типы параметров разные. _TCHAR определяется как char или wchar_t. Таким образом, _tmain — это либо main(int argc, char **argv), либо wmain(int argc, wchar_t **argv).

Причина, по которой в какой-то момент вы получали сообщение об ошибке _tmain, вероятно, заключалась в том, что вы не изменили тип argv на _TCHAR**.

Если вы не планируете когда-либо поддерживать ANSI (вероятно, нет), вы можете переформулировать свою точку входа как

int wmain(int argc, wchar_t *argv[])

и удалите строку включения tchar.h.

person Seva Alekseyev    schedule 28.06.2012
comment
Я попытался изменить int main() на int _tmain(), и все еще есть ошибка lnk2019. - person forest.peterson; 28.06.2012
comment
int _tmain(int argc, _TCHAR* argv[]) приводит к ошибке C2061: синтаксическая ошибка: идентификатор '_TCHAR'; Я пробовал варианты этого с int main(int argc, char** argv), которые возвращали первоначальную ошибку lnk2019. - person forest.peterson; 28.06.2012
comment
если я удалю все заголовки, за исключением #include ‹iostream›, и закомментирую все, кроме тестовой строки текста, тогда это скомпилируется, так что похоже, что проблема в одном из файлов заголовков - какой процесс отслеживать- устранить проблему в заголовке, которая приводит к основной ошибке lnk2019 - person forest.peterson; 28.06.2012
comment
Если вы получаете сообщение об ошибке в _TCHAR, поместите #include ‹tchar.h› Также см. мое редактирование. - person Seva Alekseyev; 28.06.2012
comment
это сработало. Я не подключался к #include ‹tchar.h›, указанным в некоторых потоках, на которые я ссылался, и int _tmain(int argc, _TCHAR* argv[]); можете ли вы объяснить, что происходит функционально - что не так с int main(), зачем все это? - person forest.peterson; 28.06.2012
comment
Мы говорим это, проголосовав за ответ :) - person Seva Alekseyev; 04.06.2013
comment
Я изменил подсистему с консоли на Windows, и это решило мою проблему! - person Shuhrat Akramov; 16.12.2016

Поскольку это еще не упоминалось, это было решением для меня:

У меня была эта ошибка с DLL после создания новой конфигурации для моего проекта. Мне пришлось пойти к Project Properties -> Configuration Properties -> General и изменить Configuration Type на Dynamic Library (.dll).

Поэтому, если у вас все еще возникают проблемы после того, как вы попробовали все остальное, стоит проверить, соответствует ли тип конфигурации тому, что вы ожидаете для своего проекта. Если он установлен неправильно, компилятор будет искать неправильный главный символ. В моем случае он искал WinMain вместо DllMain.

person Dizzyspiral    schedule 11.03.2014

Я получил эту ошибку, когда пытался отключить предварительно скомпилированные заголовки в проекте консольного приложения и удалить файл заголовка stdafx.h

Чтобы исправить это, перейдите в свойства проекта -> Linker -> SubSystem и измените значение на Not Set.

В своем основном классе используйте стандартный прототип основной функции С++, о котором уже упоминали другие:

int main(int argc, char** argv)
person Mustafa Abukhadra    schedule 17.04.2013

Если у вас есть «проект Win32» + определен WinMain, а параметр компоновщика вашей подсистемы установлен на WINDOWS, вы все равно можете получить эту ошибку компоновщика, если кто-то установил «Дополнительные параметры» в настройках компоновщика на «/SUBSYSTEM:CONSOLE» (выглядит например, этот дополнительный параметр предпочтительнее фактического параметра SubSystem.

person TomSmartBishop    schedule 05.03.2015

Я обнаружил, что когда я выбираю опцию Project->Properties->Linker->System->SubSystem->Console(/subsystem:console), а затем обязательно включаю функцию: int _tmain(int argc,_TCHAR* argv[] ){return 0} все компиляция, компоновка и запуск будут в порядке;

person Shania    schedule 04.12.2013
comment
обязательно включите tchar.h - person Shania; 04.12.2013
comment
Это сработало и для меня. На самом деле это работало и тогда, когда подсистема «не установлена». - person user2799508; 06.08.2014

У меня была эта ошибка, когда я случайно поместил wmain в пространство имен. wmain не должен находиться ни в одном пространстве имен. Более того, у меня была функция main в одной из библиотек, которыми я пользовался, и VS взял основную функцию оттуда, что сделало ее еще более странной.

person Pagefault    schedule 03.08.2014
comment
Бьюсь об заклад, это проблема во многих случаях. - person livin_amuk; 11.04.2017

У меня была эта проблема несколько минут назад. Это исчезло, когда я добавил «extern «C»» в определение main().

Как ни странно, другая простая программа, которую я написал вчера, почти идентична, не имеет внешней "C", но скомпилирована без этой ошибки компоновщика.

Это заставляет меня думать, что проблема заключается в какой-то тонкой настройке, которую можно найти глубоко в каком-то диалоговом окне конфигурации, и что «внешний «C» на самом деле не решает основную проблему, а лишь поверхностно заставляет все работать.

person DarenW    schedule 31.12.2014

этот main работает как в Linux, так и в Windows - нашел его методом проб и ошибок и с помощью других, поэтому не могу объяснить, почему он работает, он просто работает int main(int argc, char** argv)

нет необходимости tchar.h

и вот тот же ответ в Википедии Основная функция

person forest.peterson    schedule 08.03.2013

В моем случае это произошло из-за того, что я случайно удалил (не удалил) файлы stdafx.h и targetver.h в разделе Файлы заголовков.

Добавьте эти файлы обратно в Файлы заголовков, и проблема будет решена.

У меня были такие:

#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()

Мне просто нужно прокомментировать это (поставив перед ним //), и это хорошо.

person Hendy Irawan    schedule 19.03.2015

У меня это произошло и в Visual Studio 2015 по интересной причине. Просто добавлю это сюда на случай, если это случится с кем-то еще.

У меня уже было несколько файлов в проекте, и я добавлял еще один, который имел бы в нем основную функцию, однако, когда я изначально добавлял файл, я сделал опечатку в расширении (.coo вместо .cpp). Я исправил это, но когда я сделал это, я получил эту ошибку. Оказалось, что Visual Studio умничала и при добавлении файла решила, что это не исходный файл из-за исходного расширения.

Щелчок правой кнопкой мыши по файлу в обозревателе решений и выбор «Свойства» -> «Общие» -> «Тип элемента» и установка для него значения «Компилятор C/C++» устранили проблему.

person Sebastian K    schedule 03.10.2015

У меня была проблема раньше, но она была решена. Основная проблема заключалась в том, что я по ошибке написал функцию int main(). Вместо int main() я написал int mian().... Ура!

person Serign Modou Bah    schedule 19.07.2016
comment
Этот ответ слишком специфичен для вас. Поскольку main нигде в вопросе ОП не написано с ошибкой, нет причин предполагать, что это проблема. - person lwassink; 19.07.2016
comment
ОП не показывал исходный код, он просто указал на ошибку. Сегодня у меня была такая же ошибка, но позже я понял, что неправильно написал слово main, поэтому после исправления ошибка исчезла. - person Serign Modou Bah; 19.07.2016

Снимок экрана Visual Studio 2015

Установите систему на консоль, следуя предыдущим предложениям. Только, еще пришлось поменять кодировку на Unicode, см. снимок Visual Studio 2015 выше.

person LastBlow    schedule 13.11.2016