it-swarm.it

LNK2019: simbolo esterno non risolto _main referenziato nella funzione ___tmainCRTStartup

Ho il seguente errore LNK2019: simbolo esterno non risolto _main referenziato nella funzione ___tmainCRTStartup, 

Ci sono molti thread relativi a questo errore ma nessuna di queste soluzioni ha funzionato per me. E nessuno ha spiegato perché questo errore è qui.

Provai:

non ho provato e sospetto che anche questi non funzioneranno:

perché sto ricevendo questo errore e qual è la soluzione?

23
forest.peterson

Qual è il tuo tipo di progetto? Se si tratta di un "progetto Win32", il punto di ingresso dovrebbe essere (w)WinMain. Se si tratta di un "Progetto console Win32", dovrebbe essere (w)main. Il nome _tmain è # definito per essere main o wmain a seconda che UNICODE sia definito o meno.

Se è una DLL, allora DllMain.

Il tipo di progetto può essere visualizzato nelle proprietà del progetto, Linker, Sistema, Sottosistema. Direbbe "Console" o "Windows".

Si noti che il nome del punto di ingresso varia a seconda che UNICODE sia definito o meno. In VS2008, è definito per impostazione predefinita.

Il prototipo corretto per main è o

int _tmain(int argc, _TCHAR* argv[])

int _tmain()

Assicurati che sia uno di quelli.

MODIFICARE:

Se ricevi un errore su _TCHAR, inserisci un

#include <tchar.h>

Se ritieni che il problema riguardi una delle intestazioni, vai alle proprietà del file con main () e, in Preprocessore, abilita la generazione del file preelaborato. Quindi compilare. Otterrai un file con lo stesso nome di un'estensione .i. Aprilo e vedi se qualcosa di sgradevole è successo alla funzione main (). Ci possono essere #define canaglia in teoria ...

EDIT2:

Con UNICODE definito (che è l'impostazione predefinita), il linker si aspetta che il punto di ingresso sia wmain (), non main (). _tmain ha il vantaggio di essere UNICODE-agnostico - si traduce in main o wmain.

Qualche tempo fa, c'era un motivo per mantenere sia una build ANSI che una build Unicode. Il supporto Unicode era notevolmente incompleto in Windows 95/98/Me. Le API primarie erano ANSI e le versioni Unicode esistevano qui e là, ma non in modo pervasivo. Inoltre, il debugger VS ha avuto problemi a visualizzare stringhe Unicode. Nei sistemi operativi del kernel NT (ovvero Windows 2000/XP/Vista/7/8/10), il supporto Unicode è primario e le funzioni ANSI vengono aggiunte in cima. Quindi, dal momento che VS2005, la creazione predefinita del progetto è Unicode. Ciò significa - wmain. Non potevano mantenere lo stesso nome del punto di ingresso perché i tipi di parametro sono diversi. _TCHAR è # definito per essere char o wchar_t. Quindi _tmain è main (int argc, char ** argv) o wmain (int argc, wchar_t ** argv).

Il motivo per cui hai avuto un errore su _tmain a un certo punto era probabilmente perché non hai cambiato il tipo di argv in _TCHAR**.

Se non hai intenzione di supportare ANSI (probabilmente no), puoi riformulare il tuo punto di ingresso come

int wmain(int argc, wchar_t *argv[])

e rimuovere la riga include tchar.h.

28
Seva Alekseyev

Perché non è stato ancora menzionato, questa è stata la soluzione per me:

Ho avuto questo errore con una DLL dopo aver creato una nuova configurazione per il mio progetto. Dovevo andare su Project Properties -> Configuration Properties -> General e cambiare Configuration Type in Dynamic Library (.dll).

Quindi, se hai ancora problemi dopo aver provato tutto il resto, vale la pena controllare se il tipo di configurazione è quello che ti aspetti dal tuo progetto. Se non è impostato correttamente, il compilatore cercherà il simbolo principale sbagliato. Nel mio caso, cercava WinMain invece di DllMain.

6
Dizzyspiral

Ho ricevuto questo errore mentre stavo cercando di disattivare le intestazioni precompilate in un progetto di applicazione console e rimuovere il file di intestazione stdafx.h

Per risolvere questo problema vai alle proprietà del tuo progetto -> Linker -> SubSystem E cambia il valore in Not Set

Nella tua classe principale, usa il protoipo standard della funzione principale C++ che altri hanno già menzionato:

int main(int argc, char** argv)
3

Se si dispone di un "progetto Win32" + definito un WinMain e l'impostazione del sottosistema Sottosistema è impostata su WINDOWS si può ancora ottenere questo errore del linker nel caso in cui qualcuno abbia impostato "Opzioni aggiuntive" nelle impostazioni del linker su "/ SUBSYSTEM: CONSOLE" (aspetto come questa impostazione aggiuntiva è preferibile rispetto alle reali impostazioni del sottosistema.

2
TomSmartBishop

Ho avuto questo problema pochi minuti fa. È andato via quando ho aggiunto "extern" C "alla definizione main (). 

Stranamente, un altro semplice programma che ho scritto ieri è quasi identico, non ha l'extern "C", ma è compilato senza questo errore di linker. 

Questo mi fa pensare che il problema sia qualche impostazione sottile da trovare in profondità in alcune finestre di configurazione, e che "extern" C "" non risolva realmente il problema sottostante, ma fa funzionare superficialmente le cose.

1
DarenW

Ho avuto questo errore quando ho inserito accidentalmente wmain all'interno di uno spazio dei nomi. wmain non dovrebbe essere in alcun spazio dei nomi. Inoltre, ho avuto una funzione principale in una delle librerie che stavo usando, e VS ha preso il main da lì, cosa lo ha reso ancora più strano.

1
Pagefault

Lo trovo quando scelgo l'opzione di Progetto-> Proprietà-> Linker-> Sistema-> Sottosistema-> Console (/ sottosistema: console), E quindi assicurati di includere La funzione: Int _tmain (int argc, _TCHAR * argv [ ]) {return 0} la compilazione, il collegamento e l'esecuzione saranno ok;

1
Shania

Ciò è avvenuto anche in Visual Studio 2015 per un motivo interessante. Aggiungilo qui nel caso in cui capiti a qualcun altro.

Avevo già un numero di file nel progetto e ne aggiungevo un altro che avrebbe avuto la funzione principale, tuttavia quando inizialmente ho aggiunto il file ho fatto un refuso nell'estensione (.coo invece di .cpp). L'ho corretto, ma quando ho finito ho ricevuto questo errore. Si è scoperto che Visual Studio era intelligente e quando il file è stato aggiunto ha deciso che non è un file sorgente a causa dell'estensione iniziale.

Facendo clic con il pulsante destro del mouse sul file nella soluzione Explorer e selezionando Proprietà -> Generale -> ItemType e impostandolo su "Compilatore C/C++" risolto il problema.

0
Sebastian K

questo main funziona sia in linux che in windows - lo ha trovato per tentativi ed errori e l'aiuto degli altri, quindi non può spiegare perché funzioni, fa solo int main(int argc, char** argv)

nessun tchar.h necessario

ed ecco la stessa risposta in Wikipedia Funzione principale

0
forest.peterson

Nel mio caso, è perché ho rimosso per errore (non cancellato) i file stdafx.h e targetver.h nella sezione Header Files .

Aggiungi questi file in Header Files e il problema è risolto.

Ho avuto questi:

#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()

Devo solo commentare (anticipando //) ed è buono.

0
Hendy Irawan

Ho avuto il problema prima, ma è stato risolto. Il problema principale era che ho erroneamente scritto la funzione int main (). Invece di scrivere int main () ho scritto int mian () .... Cheers!

0
Serign Modou Bah

 Screen snapshot Visual Studio 2015

Imposta il sistema su console, seguendo i suggerimenti precedenti. Solo, doveva anche cambiare il set di caratteri in Unicode, vedere l'istantanea di Visual Studio 2015 sopra.

0
LastBlow