LNK2019: неразрешенный внешний символ _main, указанный в функции ___tmainCRTStartup
У меня есть следующая ошибка LNK2019: нерешенный внешний символ _main, указанный в функции ___tmainCRTStartup,
Есть много потоков, связанных с этой ошибкой, но ни один из этих решений не работал у меня. И никто не объяснил, почему эта ошибка здесь.
Я пробовал:
- wWinMainCRTStartup как точка входа в свойствах компоновщика http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/14e85604-6929-4707-a22e-8cdf596926a6
- установите компоновщик в "Windows" (тот же поток, что и выше)
- Щелкните правой кнопкой мыши имя решения- > Добавить- > Существующий элемент- > файл с основным (тот же поток, что и выше)
-
- попробуйте свойства Project +, C/С++, генерация кода, проверка безопасности буфера = нет http://social.msdn.microsoft.com/Forums/hi-IN/vclanguage/thread/e2ea62c3-beb3-47a4-8963-60b799e3375a
- Опции: C/С++, генерация кода, библиотека времени выполнения =/MTd; C/С++, генерация кода, основные проверки выполнения = по умолчанию; C/С++, генерация кода, проверка безопасности буфера = нет; Linker, Advanced, Entry Point = main http://social.msdn.microsoft.com/Forums/hi-IN/vclanguage/thread/e2ea62c3-beb3-47a4-8963-60b799e3375a
- Закомментированные заголовки в main.cpp, кроме 'using namespace std' и #include, приводят к каскадной и снежной ошибке из функций, ссылающихся на эти заголовки.
- Я удалил все в main.cpp кроме тестового кода и исключил все исходные файлы, кроме main.cpp; как и ожидалось, это сработало, поэтому небольшой шаг в правильном направлении. Проблема должна заключаться в одном из файлов заголовков.
- создать новый проект с помощью шаблона приложения Win32 Windows http://social.msdn.microsoft.com/Forums/ar-SA/vcgeneral/thread/105a366f-c38d-4c1c-9278-eca64589e7ca и http://social.msdn.microsoft.com/Forums/zh/Vsexpressvc/thread/341780c2-162e-4b36-9402-283c0cf7c0ac
не пробовали и не подозревали, что они также не будут работать:
почему я получаю эту ошибку и что такое решение?
Ответы
Ответ 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().... Приветствия!