Подтвердить что ты не робот

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

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

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

Я пробовал:

не пробовали и не подозревали, что они также не будут работать:

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

4b9b3361

Ответ 1

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

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

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

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

Правильный прототип для main - это

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

или

int _tmain()

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

EDIT:

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

#include <tchar.h>

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

EDIT2:

Если 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 является либо основным (int argc, char ** argv), либо wmain (int argc, wchar_t ** argv).

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

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

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

и удалите строку tchar.h include.

Ответ 2

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

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

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

Ответ 3

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

Чтобы исправить это, перейдите к своим свойствам проекта → Linker → SubSystem и измените значение на Не установлено

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

int main(int argc, char** argv)

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

У меня были следующие:

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

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

Ответ 10

Я тоже это случилось в Visual Studio 2015 по интересной причине. Просто добавьте его здесь, если это произойдет с кем-то еще.

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

Щелкните правой кнопкой мыши файл в проводнике решений и выберите "Свойства" → "Общие" → "ItemType" и установите его в "компилятор C/С++". Проблема была устранена.

Ответ 11

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

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

Ответ 12

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