errore LNK2019: simbolo esterno non risolto _WinMain @ 16 a cui si fa riferimento nella funzione ___tmainCRTStartup


143

Mentre eseguo il codice semplice come di seguito, ho due errori come segue:

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

Errori:

MSVCRTD.lib (crtexew.obj): errore LNK2019: simbolo esterno non risolto a cui si fa _WinMain@16riferimento nella funzione___tmainCRTStartup

Cosa dovrei fare?


1
È tutto questo il codice? Dov'è la tua funzione principale?
Connman,

2
Sembra anche che il tipo di progetto sia impostato in modo errato. L'errore del linker relativo a WinMain implica che hai tentato di creare un progetto Win32. Se vuoi solo qualcosa per l'output del testo al prompt dei comandi, prova a cambiare il tipo di progetto in Console.
Kilanash,

4
A proposito, se ricevi errori del compilatore / linker, non stai "eseguendo" il codice.
André Caron,

1
Ho provato a cambiare il tipo di progetto, ma project = exe ha funzionato invece di console.
Dom

Risposte:


352

Questo è un problema del linker.

Prova a cambiare Proprietà -> Linker -> Sistema -> Sottosistema (in Visual Studio).

da Windows (/ SOTTOSISTEMA: WINDOWS) a Console (/ SOTTOSISTEMA: CONSOLLE)

Questo mi ha aiutato


3
Ho lo stesso problema. La tua risposta non aiuta. Qualche altro suggerimento?
Parth Sane,

1
Ho avuto questo problema durante l'utilizzo di MS Visual Studio. Se l'ambiente è diverso, potrebbe essere necessario risolverlo in modo diverso. Ma dovrebbe comunque essere un problema di linker.
Bohdan,

2
Se si utilizza tWinMaincome funzione principale, è necessario includere tchar.h o modificarlo in WinMaino in wWinMainbase alla propria app Unicode. In caso contrario, viene generato anche questo errore del linker anche con il sottosistema corretto. (/ SOTTOSISTEMA: WINDOWS)
Lisa

Questo mi ha aiutato, a parte quello che ho dovuto disabilitare anche l'antivirus Avast .
XCS

1
Questo ha funzionato solo dopo aver selezionato "tutte le configurazioni" sia per la piattaforma che per il tipo. Selezionando "build" sulla "Soluzione" si è tentato di creare tutto e il primo provato NON era quello specificato per il sottosistema console.
Joseph Stateson,

83

Come menzionato dagli altri, è possibile modificare il sottosistema in console e l'errore scompare.

Oppure, se vuoi mantenere il sottosistema Windows, puoi semplicemente suggerire qual è il tuo punto di ingresso, perché non hai definito ___tmainCRTStartup. Puoi farlo aggiungendo quanto segue a Proprietà -> Linker -> Riga di comando :

/ INGRESSO: "mainCRTStartup"

In questo modo ti sbarazzi della finestra della console.


3
+1: "In questo modo ti sbarazzi della finestra della console." - Freddo! Ho imparato sth. nuovo oggi!
Valentin Heinitz,

1
+1 per il consiglio, stavo cercando di capirlo per circa 20 minuti, dal momento che con SFML posso semplicemente specificare il sottosistema Windows, con GLFW che ovviamente non differisce così grazie (=
Daniel

14

Se stai riscontrando questo problema e stai usando Qt, devi collegare qtmain.lib o qtmaind.lib


Quello è su Progetto -> Proprietà -> Linker -> Input. Aggiungi $(QTDIR)\lib\qtmaind.liba Dipendenze aggiuntive.
Mathiasfk,

1
L'aggiunta CONFIG += consoleal .profile ha risolto il problema per il mio progetto Qt
Synck,

12

Oltre a modificarlo Console (/SUBSYSTEM:CONSOLE)come altri hanno già detto, potrebbe essere necessario modificare il punto di ingresso in Proprietà -> Linker -> Avanzate -> Punto di ingresso. Impostalo su mainCRTStartup .

Sembra che Visual Studio potrebbe cercare la funzione WinMain anziché main, se non si specifica diversamente.


10

Includi <tchar.h>quale ha la linea:

#define _tWinMain wWinMain

7

Se si utilizza il set di caratteri Unicode, ma la voce non è stata impostata, è possibile specificare / ENTRY: "wWinMainCRTStartup"


salvavita per me! Stavo usando cmake + mfc (unicode)
malat

4

non vedo la funzione principale.

assicurati che abbia la funzione principale.

esempio :

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

}

spero che funzioni bene. :)


Questo non aiuta. Il linker si lamenta di un punto di ingresso WinMain non definito . La definizione di un punto di ingresso chiamato mainnon fa nulla per risolverlo.
Indispensabile il

Il linker tenta di risolvere diverse versioni main/ WinMaine, se nessuna di esse viene trovata, dice WinMain @ 16 non trovato , ma questo messaggio non è esattamente corretto.
Lorinczy Zsigmond,

3

Se il tuo progetto è Dll, il linker potrebbe voler creare un programma console. Apri le proprietà del progetto. Seleziona le impostazioni generali. Seleziona lì il tipo di configurazione Libreria dinamica (.dll).


Ho esattamente quel problema, ma sebbene il .dllcompilatore sia impostato sta ancora cercando di creare l'app di Windows.
Tomáš Zato - Ripristina Monica

3

Non sono sicuro di dove pubblicare questa mia risposta, ma penso che sia il posto giusto. Oggi ho riscontrato questo errore e il passaggio da un sottosistema all'altro non ha cambiato nulla.

Cambiare i file lib a 64 bit in 32 bit (x86) ha fatto il trucco per me, spero che possa aiutare qualcuno là fuori!


Ci ho provato e ho funzionato, anche se funziona anche una ricompilazione di dipendenze per gli stessi obiettivi.
Jamie Nicholl-Shelley,

ha funzionato anche per me ... sembra che la procedura guidata di unit test utilizzi un punto di ingresso a 32 bit
Erik Aronesty,

3

Se si desidera effettivamente utilizzare _tWinMain () anziché main (), assicurarsi che la configurazione rilevante del proprio progetto abbia

  1. Linker-> Sistema -> Sottosistema => Windows (/ SOTTOSISTEMA: WINDOWS)
  2. C / C ++ -> Preprocessore -> Definizioni preprocessore => Sostituisci _CONSOLE con _WINDOWS
  3. Nel file c / cpp in cui è definito _tWinMain () , aggiungere:

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


2

Hai provato a trasformare quel file sorgente in un eseguibile, il che ovviamente non è possibile, perché il punto di ingresso obbligatorio, la mainfunzione, non è definito. Aggiungi un file main.cpp e definisci una funzione principale. Se stai lavorando sulla riga di comando (che dubito), puoi aggiungere /csolo compilare e non collegare. Questo produrrà solo un file oggetto, che deve essere collegato in una lib statica o condivisa o in un'applicazione (nel qual caso sarà necessario un file di espulsione con main definito).

_WinMainè il nome di Microsoft per mainquando si collega.

Inoltre: non stai ancora eseguendo il codice, lo stai compilando (e collegando). C ++ non è un linguaggio interpretato.


5
In realtà, ha bisogno di un WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)punto di ingresso. Questo errore del linker indica che il progetto è stato creato per il sottosistema Windows, non per il sottosistema console.
Adam Maras,

@Adam: ah sì, sono stato viziato da Qt :) (che nasconde efficacemente WinMain da te).
rubenvb,

WinMain è solo per applicazioni Windows. Le app della console usano un nome diverso _tmain, che si risolve in main o wmain a seconda dell'impostazione Unicode / MBCS.
Steve Townsend,

@AdamMaras, perfetto. Stavo cercando la capitalizzazione e il prototipo richiesti. Funziona perfettamente ora. Grazie!
Synetech,

_WinMain@16è il simbolo decorato del punto di ingresso fornito dall'utente chiamato dal codice di avvio nel CRT, quando si sceglie come target il sottosistema Windows. Non è "il nome di Microsoft per mainquando si collega" . Se scegli come target il sottosistema console, il CRT fornito con Visual Studio chiamerà un punto di ingresso denominato main. Se non definito, il linker si lamenterà di un simbolo mancante chiamato _main.
Indispensabile il

1

Se si utilizza CMake, è possibile visualizzare questo errore anche quando si imposta SET(GUI_TYPE WIN32)su un'applicazione console.


1

I suggerimenti eruditi sopra menzionati risolveranno il problema nel 99,99% dei casi. Per fortuna non l'hanno fatto. Nel mio caso si è scoperto che stavo includendo un file di intestazione da un diverso progetto di Windows. Abbastanza sicuro, in fondo a quel file ho trovato la direttiva:

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

Inutile dire che rimuovere questa riga ha risolto il mio problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.