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

145

Пока я запускаю простой код, показанный ниже, у меня есть две следующие ошибки:

#include <iostream>
#include <string>
using namespace::std;

template <class Type>
class Stack
{
public:
    Stack (int max):stack(new Type[max]), top(-1), maxsize(max){}
    ~Stack (void) {delete []stack;}
    void Push (Type &val);
    void Pop (void) {if (top>=0) --top;}
    Type& Top (void) {return stack[top];}
    //friend ostream& operator<< (ostream&, Stack&);
private:
    Type *stack;
    int top;
    const int maxSize;
};

template <class Type>
void Stack <Type>:: Push (Type &val)
{
    if (top+1<maxsize)
        stack [++top]=val;
}

Ошибки:

MSVCRTD.lib (crtexew.obj): ошибка LNK2019: неразрешенный внешний символ, указанный _WinMain@16в функции___tmainCRTStartup

Что я должен делать?

NAIEM
источник
1
Это весь код? Где ваша основная функция?
Connman 08
2
Также похоже, что тип проекта установлен неправильно. Ошибка компоновщика в отношении WinMain означает, что вы пытались создать проект Win32. Если вы просто хотите, чтобы текст выводился в командную строку, попробуйте изменить тип проекта на «Консоль».
Kilanash 08
4
Между прочим, если вы получаете ошибки компилятора / компоновщика, вы не «запускаете» код.
Андре Карон
1
Я попытался изменить тип проекта, но вместо console работал project = exe.
Dom

Ответы:

358

Это проблема компоновщика.

Попробуйте изменить Properties -> Linker -> System -> SubSystem (в Visual Studio).

из Windows (/ SUBSYSTEM: WINDOWS) в консоль (/ SUBSYSTEM: CONSOLE)

Это помогло мне

Богдан
источник
3
У меня такая же проблема. Ваш ответ не помогает. Любое другое предложение?
Parth Sane
1
У меня была эта проблема при использовании MS Visual Studio. Если ваша среда отличается, вам, возможно, придется исправить ее по-другому. Но это все равно проблема компоновщика.
Богдан
2
Если вы используете в tWinMainкачестве основной функции, вы должны включить tchar.h или изменить его на любой WinMainили в wWinMainзависимости от того, поддерживает ли ваше приложение Unicode. Несоблюдение этого правила также приводит к ошибке компоновщика даже с правильной подсистемой. (/ SUBSYSTEM: WINDOWS)
Лиза,
Это помогло мне, кроме того, мне пришлось отключить антивирус Avast .
XCS
1
Это сработало только после того, как я выбрал «все конфигурации» как для платформы, так и для типа. При выборе «build» в «Solution» была предпринята попытка собрать все, и первая попытка НЕ ​​была той, которая была указана для консольной подсистемы.
Джозеф Стейтэйтс,
84

Как уже упоминалось, вы можете изменить подсистему на консоль, и ошибка исчезнет.

Или, если вы хотите сохранить подсистему Windows, вы можете просто намекнуть, какая у вас точка входа, потому что вы еще не определили ее ___tmainCRTStartup. Вы можете сделать это, добавив следующее в Свойства -> Компоновщик -> Командная строка :

/ ЗАПИСЬ: "mainCRTStartup"

Таким образом вы избавитесь от окна консоли.

Мортен Кристенсен
источник
3
+1: «Так вы избавитесь от окна консоли». - Круто! Узнал что-то. новинка сегодня!
Валентин Хайниц
1
+1 за совет, я пытался понять это около 20 минут, так как с SFML я могу просто указать подсистему Windows, с GLFW, которая явно не отличается, поэтому спасибо (=
daniel
15

Если у вас возникла эта проблема и вы используете Qt - вам необходимо связать qtmain.lib или qtmaind.lib

Дэвид Каспер
источник
Это в Project -> Properties -> Linker -> Input. Добавить $(QTDIR)\lib\qtmaind.libв дополнительные зависимости.
mathiasfk
1
Добавление CONFIG += consoleв .proфайл
устранило
14

Помимо изменения его на, Console (/SUBSYSTEM:CONSOLE)как говорили другие, вам может потребоваться изменить точку входа в Properties -> Linker -> Advanced -> Entry Point. Установите значение mainCRTStartup .

Кажется, что Visual Studio может искать функцию WinMain вместо main, если вы не укажете иное.

mathiasfk
источник
10

Включить, в <tchar.h>котором есть строка:

#define _tWinMain wWinMain
Заки
источник
7

Если вы используете набор символов Unicode, но запись не была установлена, вы можете указать / ENTRY: "wWinMainCRTStartup"

Петроний
источник
спасатель жизни для меня! Я использовал cmake + mfc (unicode)
malat
4

я не вижу основной функции.

убедитесь, что у него есть основная функция.

пример :

int main(int argc, TCHAR *argv[]){

}

надеюсь, что он работает хорошо. :)

Джефри да Гуччи
источник
Это не помогает. Компоновщик жалуется на неопределенную точку входа WinMain . Определение точки входа под названием mainничего не решает.
IInspectable
Компоновщик пытается разрешить разные main/ WinMainверсии, и если ни одна из них не найдена, он сообщает, что WinMain @ 16 не найден , но это сообщение не совсем правильное.
Lorinczy Zsigmond 01
3

Если ваш проект - Dll, возможно, компоновщик хочет создать консольную программу. Откройте свойства проекта. Выберите Общие настройки. Выберите там тип конфигурации Dynamic Library (.dll).

мир грез
источник
У меня именно такая проблема, но, хотя .dllустановленный компилятор все еще пытается создать приложение для Windows.
Томаш Зато - Восстановите Монику
3

Я не уверен, где разместить этот свой ответ, но я думаю, что это подходящее место. Сегодня я столкнулся с этой самой ошибкой, и переключение подсистем ничего не изменило.

Изменение 64-битных файлов lib на 32-битные (x86) помогло мне, я надеюсь, что это поможет кому-то там!

Другой Джо
источник
Я попробовал это и сработал, хотя перекомпиляция зависимостей для тех же целей тоже работает.
Джейми Николл-Шелли
также работал у меня ... похоже, что мастер модульного тестирования использует 32-битную точку входа
Эрик Аронести
3

Если вы действительно хотите использовать _tWinMain () вместо main (), убедитесь, что в соответствующей конфигурации вашего проекта есть

  1. Компоновщик-> Система -> Подсистема => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Препроцессор -> Определения препроцессора => Замените _CONSOLE на _WINDOWS
  3. В файле c / cpp, где определена _tWinMain () , добавьте:

    #include <Windows.h> #include <tchar.h>

Alex
источник
2

Вы пытались превратить этот исходный файл в исполняемый файл, что, очевидно, невозможно, потому что обязательная точка входа, mainфункция, не определена. Добавьте файл main.cpp и определите главную функцию. Если вы работаете с командной строкой (в чем я сомневаюсь), вы можете добавить /cтолько для компиляции, а не для ссылки. Это создаст только объектный файл, который необходимо связать либо со статической, либо с общей библиотекой, либо с приложением (в этом случае вам понадобится файл oject с определенным main).

_WinMain- это имя Microsoft mainпри связывании.

Также: вы еще не запускаете код, вы его компилируете (и связываете). C ++ не является интерпретируемым языком.

rubenvb
источник
5
Собственно, ему нужна WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)точка входа. Эта ошибка компоновщика указывает на то, что проект создается для подсистемы Windows, а не для подсистемы консоли.
Adam Maras
@ Адам: ах, да, Qt меня избаловал :) (который эффективно скрывает от вас WinMain).
rubenvb 08
WinMain предназначен только для приложений Windows. Консольные приложения используют другое имя _tmain, которое преобразуется в main или wmain в зависимости от настройки Unicode / MBCS.
Стив Таунсенд
@AdamMaras, отлично. Я искал необходимые заглавные буквы и прототип. Теперь он работает отлично. Благодарность!
Synetech
_WinMain@16- это украшенный символ предоставленной пользователем точки входа, вызываемой кодом запуска в CRT при нацеливании на подсистему Windows. Это не «имя Microsoft mainпри создании ссылок» . Если вы нацеливаетесь на подсистему консоли, CRT, поставляемый с Visual Studio, будет вызывать точку входа с именем main. Если не определено, компоновщик пожалуется на отсутствующий символ с именем _main.
IInspectable
1

Если вы используете CMake, вы также можете получить эту ошибку при установке SET(GUI_TYPE WIN32)в консольном приложении.

Николас Хольтхаус
источник
1

Упомянутые выше предложения эрудитов решат проблему в 99,99% случаев. Мне повезло, что они этого не сделали. В моем случае оказалось, что я включил файл заголовка из другого проекта Windows. Конечно же, в самом низу этого файла я нашел директиву:

#pragma comment(linker, "/subsystem:Windows")

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

Моше Рубин
источник