2012-06-28 135 views
22

tengo el siguiente LNK2019 de error: símbolo externo sin resolver _main referencia en ___tmainCRTStartup función,LNK2019: símbolo externo sin resolver _main referencia en ___tmainCRTStartup función

Hay una gran cantidad de temas relacionados con este error pero ninguna de esas soluciones trabajaban para yo. Y ninguno explica por qué este error está aquí.

me trataron:

no han intentado y sospechan que estos también no funcionarán:

¿Por qué recibo este error y cuál es la solución?

+1

¿Tiene una función 'int main (char ** argv, int argc)'? – Linuxios

+3

@Linuxios, es "int main (int argc, char ** argv)" (el orden es incorrecto en su prototipo) – BlakBat

+1

@BlakBat: Gracias. Lo siento. Ni siquiera trabajo en Windows de todos modos, pero esa es la firma en todas partes. Doh. – Linuxios

Respuesta

27

¿Cuál es su tipo de proyecto? Si se trata de un "proyecto Win32", su punto de entrada debe ser (w)WinMain. Si se trata de un "Proyecto de consola Win32", entonces debería ser (w)main. El nombre _tmain está #defined para ser main o wmain dependiendo de si UNICODE está definido o no.

Si es una DLL, entonces DllMain.

El tipo de proyecto se puede ver en Propiedades del proyecto, Enlazador, Sistema, Subsistema. Diría "Consola" o "Windows".

Tenga en cuenta que el nombre del punto de entrada varía según si UNICODE está definido o no. En VS2008, está definido por defecto.

El prototipo adecuado para el principal es o bien

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

o

int _tmain() 

Asegúrese de que es uno de esos.

EDIT:

Si usted está recibiendo un error en _TCHAR, colocar un

#include <tchar.h> 

Si piensa que el problema es con una de las cabeceras, vaya a las propiedades del archivo con el principal(), y en Preprocesador, habilite la generación del archivo preprocesado. Luego compila. Obtendrás un archivo con el mismo nombre, una extensión .i. Ábralo, y vea si algo desagradable le pasó a la función main(). No puede haber #defines deshonestos en teoría ...

Edit2:

Con UNICODE definido (que es el valor predeterminado), el enlazador espera que el punto de entrada a ser wmain(), no main(). _tmain tiene la ventaja de ser UNICODE-agnóstico, se traduce en main o wmain.

Hace algún tiempo, había una razón para mantener tanto una compilación ANSI como una compilación Unicode. El soporte de Unicode estaba muy incompleto en Windows 95/98/Me. Las API principales eran ANSI, y las versiones Unicode existían aquí y allá, pero no de forma generalizada. Además, el depurador VS tenía problemas para mostrar cadenas Unicode. En los sistemas operativos NT kernel (Windows 2000/XP/Vista/7/8/10), la compatibilidad Unicode es primaria y las funciones ANSI se agregan en la parte superior. Así que desde VS2005, el valor predeterminado al momento de la creación del proyecto es Unicode. Eso significa - wmain. No pudieron mantener el mismo nombre de punto de entrada porque los tipos de parámetros son diferentes. _TCHAR está #defined para ser char o wchar_t. Entonces _tmain es main (int argc, char ** argv) o wmain (int argc, wchar_t ** argv).

La razón por la que recibía un error en _tmain en algún momento fue probablemente porque no cambió el tipo de argv a _TCHAR**.

Si usted no está planeando alguna ayuda ANSI (probablemente no), se puede reformular su punto de entrada como

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

y retire la tchar.h línea include.

+0

tipo de proyecto es Consola –

+0

He intentado cambiar int main() a int _tmain() y todavía hay un error lnk2019 –

+0

int _tmain (int argc, _TCHAR * argv []) resulta en el error C2061: error de sintaxis: identificador '_TCHAR '; Intenté variaciones de esto con int main (int argc, char ** argv) que devolvía el error intial lnk2019 –

0

esta main funciona tanto en Linux y Windows - visto en prueba y error y ayuda a los demás por lo que no se puede explicar por qué funciona, simplemente lo hace int main(int argc, char** argv)

sin tchar.h necesaria

y aquí está la misma respuesta en Wikipedia Main function

+0

¿Has oído hablar de wmain()? –

3

Recibí este error mientras intentaba desactivar encabezados precompilados en un Proyecto de aplicación de consola y eliminar el archivo de encabezado stdafx.h

Para solucionar esto, vaya a las propiedades del proyecto -> Enlazador -> subsistema y cambie el valor a No Configurado

En su clase principal, utilice el estándar de C++ principal función prototipo muy que otros ya han mencionado :

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

me parece que cuando yo elija la opción de Proyecto-> Propiedades-> Linker-> Sistema-> SubSystem-> consola (/ subsistema: consola), y luego asegurarse de que incluyen la función: int _tmain (int argc, _TCHAR * argv []) {return 0} toda la compilación, el enlace y la ejecución estarán bien;

+0

asegúrese de incluir tchar.h – Shania

+0

Esto también funcionó para mí. De hecho, funcionó cuando el subsistema "no está configurado" también. – user2799508

5

Debido a que no se ha mencionado todavía, esta era la solución para mí:

tuve este error con un archivo DLL después de crear una nueva configuración para mi proyecto. Tuve que ir al Project Properties -> Configuration Properties -> General y cambiar el Configuration Type al Dynamic Library (.dll).

Si aún tiene problemas después de probar todo lo demás, vale la pena comprobar si el tipo de configuración es el que espera para su proyecto. Si no está configurado correctamente, el compilador buscará el símbolo principal equivocado. En mi caso, estaba buscando WinMain en lugar de DllMain.

1

Tuve este error al poner accidentalmente el wmain dentro de un espacio de nombres. wmain no debería estar en ningún espacio de nombres. Además, tenía una función principal en una de las librerías que estaba usando, y VS tomó la principal a partir de ahí, lo que la hizo aún más extraña.

+0

Apuesto a que este es el problema en muchos casos. –

1

Tuve este problema hace unos minutos. Se fue cuando agregué "extern" C "'a la definición main().

Curiosamente, otro programa simple que escribí ayer es casi idéntico, no tiene la "C" externa, pero se compiló sin este error de enlazador.

Esto me hace pensar que el problema es algún ajuste sutil que se encuentra en algún cuadro de diálogo de configuración, y que 'externo' C "'realmente no resuelve el problema subyacente, pero superficialmente hace que las cosas funcionen.

2

Si tiene un "proyecto Win32" + definido WinMain y su configuración de enlazador SubSystem está configurado en WINDOWS todavía puede obtener este error de enlazador en caso de que alguien configure las "Opciones adicionales" en la configuración del enlazador en "/ SUBSISTEMA: consola"(parece que este ajuste adicional se prefiere sobre la configuración de subsistema real.

0

en mi caso, se debe a que accidentalmente eliminados (no eliminar) los stdafx.h y targetver.h archivos en el archivos de encabezado sección.

Agregar estos archivos volver a Archivos de encabezado y se solucionó el problema.

que tenían los siguientes:

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

sólo hay que comentar que (anteponiendo //) y es bueno.

0

Tuve esto que pasar en Visual Studio 2015 también por una razón interesante. Solo agrégalo aquí en caso de que le pase a otra persona.

Ya tenía el número de archivos en proyecto y estaba agregando otro que tendría la función principal en él, sin embargo, cuando inicialmente agregué el archivo hice un error en la extensión (.coo en lugar de .cpp). Lo corregí pero cuando terminé obtuve este error. Resultó que Visual Studio estaba siendo inteligente y cuando se agregó el archivo, decidió que no era un archivo fuente debido a la extensión inicial.

Haciendo clic derecho en el archivo en el explorador de soluciones y seleccionando Propiedades -> General -> Tipo de elemento y configurándolo como "compilador C/C++" se ha corregido el problema.

-1

Tuve el problema antes, pero fue resuelto. El principal problema es que deletreo erróneamente la función int main(). En lugar de escribir int main() escribí int mian() .... ¡Salud!

+1

Esta respuesta es demasiado específica para usted. Como 'main' no está mal escrito en ninguna parte de la pregunta del OP, no hay razón para suponer que este sea el problema. – lwassink

+1

OP no mostró ningún código fuente, acaba de indicar el error. Tuve el mismo error hoy, pero más tarde me di cuenta de que había escrito mal la palabra main, por lo que después de corregirlo desapareció el error. –

0

Screen snapshot Visual Studio 2015

Establecer el sistema a la consola, siguiendo las sugerencias anteriores. Solo que también tuvo que cambiar el conjunto de caracteres a Unicode, consulte la instantánea de Visual Studio 2015 anterior.

Cuestiones relacionadas