ошибка 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

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


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, если вы не укажете иное.



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>


2

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

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

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


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")

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.