error LNK2019: símbolo externo sin resolver _WinMain @ 16 referenciado en la función ___tmainCRTStartup

143

Mientras estoy ejecutando el código simple como se muestra a continuación, tengo dos errores como los siguientes:

#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;
}

Errores:

MSVCRTD.lib (crtexew.obj): error LNK2019: símbolo externo sin resolver al que se hace _WinMain@16referencia en la función___tmainCRTStartup

¿Qué tengo que hacer?

NAIEM
fuente
1
¿Es todo este código? ¿Dónde está tu función principal?
Connman
2
También parece que el tipo de proyecto está configurado incorrectamente. El error del vinculador con respecto a WinMain implica que trató de crear un proyecto Win32. Si solo desea que algo envíe texto al símbolo del sistema, intente cambiar el tipo de proyecto a Consola.
Kilanash
44
Por cierto, si recibe errores de compilación / enlazador, no está "ejecutando" el código.
André Caron
1
Intenté cambiar el tipo de proyecto, pero project = exe funcionó en lugar de la consola.
Dom

Respuestas:

352

Eso es un problema de enlazador.

Intente cambiar Propiedades -> Enlace -> Sistema -> Subsistema (en Visual Studio).

desde Windows (/ SUBSYSTEM: WINDOWS) a la consola (/ SUBSYSTEM: CONSOLE)

Este me ayudo

Bohdan
fuente
3
Tengo el mismo problema. Tu respuesta no está ayudando. ¿Alguna otra sugerencia?
Parth Sane
1
Tuve ese problema al usar MS Visual Studio. Si su entorno es diferente, es posible que tenga que solucionarlo de manera diferente. Pero aún así debería ser un problema de enlace.
Bohdan
2
Si está utilizando tWinMainsu función principal, debe incluir tchar.h o cambiarlo a cualquiera WinMaino wWinMaindependiendo de si su aplicación es Unicode o no. De lo contrario, también se produce este error de enlazador incluso con el subsistema correcto. (/ SUBSISTEMA: VENTANAS)
lisa
Esto me ayudó, aparte de eso también tuve que desactivar el antivirus Avast .
XCS
1
Esto funcionó solo después de seleccionar "todas las configuraciones" tanto para la plataforma como para el tipo. Al seleccionar "compilar" en la "Solución" se intentó compilar todo y el primero que se intentó NO fue el especificado para el subsistema de consola.
Joseph Stateson el
83

Como los otros mencionaron, puede cambiar el subsistema a la consola y el error desaparecerá.

O si desea mantener el subsistema de Windows, puede indicar cuál es su punto de entrada, porque no lo ha definido ___tmainCRTStartup. Puede hacer esto agregando lo siguiente a Propiedades -> Vinculador -> Línea de comando :

/ ENTRY: "mainCRTStartup"

De esta manera te deshaces de la ventana de la consola.

Morten Kristensen
fuente
3
+1: "De esta manera te deshaces de la ventana de la consola". - ¡Frio! Algo aprendido ¡nuevo hoy!
Valentin Heinitz
1
+1 por el consejo, estaba tratando de resolver esto durante unos 20 minutos, ya que con SFML solo puedo especificar el subsistema Windows, con GLFW que obviamente difiere, gracias (=
daniel
14

Si tiene este problema y está usando Qt, debe vincular qtmain.lib o qtmaind.lib

David Casper
fuente
Eso está en Proyecto -> Propiedades -> Enlace -> Entrada. Agregar $(QTDIR)\lib\qtmaind.liba dependencias adicionales.
mathiasfk
1
Agregar CONFIG += consoleal .proarchivo solucionó el problema para mi proyecto Qt
Synck
12

Además de cambiarlo a Console (/SUBSYSTEM:CONSOLE)como han dicho otros, es posible que deba cambiar el punto de entrada en Propiedades -> Vinculador -> Avanzado -> Punto de entrada. Ajústelo a mainCRTStartup .

Parece que Visual Studio podría estar buscando la función WinMain en lugar de main, si no especifica lo contrario.

mathiasfk
fuente
10

Incluya <tchar.h>cuál tiene la línea:

#define _tWinMain wWinMain
zaki
fuente
7

Si usa el juego de caracteres Unicode, pero la entrada no se configuró, puede especificar / ENTRY: "wWinMainCRTStartup"

Petronio
fuente
salvavidas para mi! Estaba usando cmake + mfc (unicode)
malat
4

No veo la función principal.

asegúrese de que tenga la función principal.

ejemplo:

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

}

Espero que funcione bien. :)

jefry da gucci
fuente
Esto no ayuda El vinculador se queja de un punto de entrada WinMain indefinido . Definir un punto de entrada llamado mainno hace nada para resolver eso.
Inspeccionable el
El vinculador intenta resolver main/ WinMainversiones diferentes , y si no se encuentra ninguna de ellas, dice WinMain @ 16 no encontrado , pero este mensaje no es exactamente correcto.
Lorinczy Zsigmond
3

Si su proyecto es Dll, entonces el caso podría ser que el enlazador desea construir un programa de consola. Abra las propiedades del proyecto. Seleccione la configuración general. Seleccione el tipo de configuración Biblioteca dinámica allí (.dll).

mundo de sueños
fuente
Tengo exactamente ese problema, pero aunque el .dllcompilador establecido todavía está tratando de construir la aplicación de Windows.
Tomáš Zato - Restablece a Mónica
3

No estoy seguro de dónde publicar esta respuesta, pero creo que es el lugar correcto. Encontré este mismo error hoy y cambiar los subsistemas no cambió nada.

Cambiar los archivos lib de 64 bits a 32 bits (x86) me sirvió, ¡espero que ayude a alguien!

Otro joe
fuente
Intenté esto y funcionó, aunque también funciona una recompilación de dependencias a los mismos objetivos.
Jamie Nicholl-Shelley
también funcionó para mí ... parece que el asistente de prueba de unidad utiliza un punto de entrada de 32 bits
Erik Aronesty
3

Si realmente desea utilizar _tWinMain () en lugar de main (), asegúrese de que la configuración relevante de su proyecto tenga

  1. Linker-> System -> SubSystem => Windows (/ SUBSYSTEM: WINDOWS)
  2. C / C ++ -> Preprocesador -> Definiciones de preprocesador => Reemplazar _CONSOLE con _WINDOWS
  3. En el archivo c / cpp donde se define _tWinMain () , agregue:

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

Alex
fuente
2

Intentaste convertir ese archivo fuente en un ejecutable, lo que obviamente no es posible, porque el punto de entrada obligatorio, la mainfunción, no está definida. Agregue un archivo main.cpp y defina una función principal. Si está trabajando en la línea de comandos (lo cual dudo), puede agregar /csolo compilar y no vincular. Esto producirá solo un archivo de objeto, que debe vincularse a una biblioteca estática o compartida o una aplicación (en cuyo caso necesitará un archivo de expulsión con el principal definido).

_WinMaines el nombre de Microsoft para maincuando se vincula.

Además: todavía no está ejecutando el código, lo está compilando (y vinculando). C ++ no es un lenguaje interpretado.

rubenvb
fuente
55
En realidad, necesita un WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)punto de entrada. Este error de vinculador indica que el proyecto se está creando para el subsistema de Windows, no para el subsistema de consola.
Adam Maras
@ Adam: ah sí, Qt me ha echado a perder :) (que efectivamente te oculta WinMain).
rubenvb
WinMain es solo para aplicaciones de Windows. Las aplicaciones de consola usan un nombre diferente _tmain, que se resuelve en main o wmain según la configuración de Unicode / MBCS.
Steve Townsend
@AdamMaras, perfecto. Estaba buscando la capitalización y el prototipo necesarios. Funciona perfectamente ahora. ¡Gracias!
Synetech
_WinMain@16es el símbolo decorado del punto de entrada proporcionado por el usuario llamado por el código de inicio en el CRT, cuando se dirige al subsistema de Windows. No es "el nombre de Microsoft para maincuando se vincula" . Si apunta al subsistema de la consola, el CRT que se incluye con Visual Studio llamará a un punto de entrada llamado main. Si no está definido, el enlazador se quejará de un símbolo faltante llamado _main.
Inspeccionable el
1

Si está utilizando CMake, también puede obtener este error cuando configura SET(GUI_TYPE WIN32)una aplicación de consola.

Nicolas Holthaus
fuente
1

Las sugerencias eruditas mencionadas anteriormente resolverán el problema en el 99.99% de los casos. Fue mi suerte que no lo hicieron. En mi caso resultó que estaba incluyendo un archivo de encabezado de un proyecto de Windows diferente. Efectivamente, al final de ese archivo encontré la directiva:

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

No hace falta decir que eliminar esta línea resolvió mi problema.

Moshe Rubin
fuente