para instalar descargar compilar como caracteristicas c++ c main

c++ - instalar - compilar g++ terminal



En un programa C/C++, ¿cómo llama el sistema(windows, linux, mac OS X) a la función main()? (7)

main() es parte de la biblioteca C y no es una función del sistema. No sé para OS X o Linux, pero Windows generalmente inicia un programa con WinMainCRTStartup() . Este símbolo inicia su proceso, extrae los argumentos de línea de comando y el entorno ( argc, argv, end ) y llama a main() . También es responsable de llamar a cualquier código que se ejecute después de main() , como atexit() .

Al buscar en su archivo de Visual Studio, debería poder encontrar la implementación predeterminada de WinMainCRTStartup para ver qué hace.

También puede definir una función propia para llamar al inicio, esto se hace cambiando el "punto de entrada" en las opciones del enlazador. Esta es a menudo una función que no toma argumentos y devuelve un vacío.

Estoy buscando una explicación más técnica, entonces el sistema operativo llama a la función. ¿Alguien puede ayudarme o señalarme a un sitio web o libro?


El archivo .exe (o equivalente en otras plataformas) contiene una dirección de ''punto de entrada''. Para una primera aproximación, el sistema operativo carga las secciones relevantes del archivo .EXE en ram, y luego salta al punto de entrada.

Como han dicho otros, este punto de entrada no será ''principal'', sino que formará parte de la biblioteca de tiempo de ejecución; hará cosas como inicializar objetos estáticos, configurar los parámetros argc / argv, configurar stdin / stdout / stderr , etc. Cuando haya hecho todo eso, llamará a su función main (). Cuando sale principal, el tiempo de ejecución pasa por un proceso análogo de pasar su código de retorno al entorno, llamando a destructores estáticos, llamando a rutinas _atexit, etc.

Si tiene herramientas MS (quizás no las gratuitas), entonces tiene todo el origen de tiempo de ejecución, y una forma fácil de verlo es poner un punto de interrupción en el corchete de cierre de su método main (), y un solo paso hacia atrás en el tiempo de ejecución.


El experto C ++ / CLI (consulte la página 279) tiene detalles muy específicos de los diferentes escenarios de arranque para ensamblajes CLR nativos, mixtos y puros.


Es dependiente del sistema operativo. En OS X, hay un marco en el encabezado mach que contiene la dirección de inicio para el registro EIP (puntero de instrucción).

Una vez que se carga el binario, el SO inicia la ejecución desde esta dirección:

cristi:test diciu$ otool -l ./a.out | grep -A 10 LC_UNIXTHREAD cmd LC_UNIXTHREAD cmdsize 80 flavor i386_THREAD_STATE count i386_THREAD_STATE_COUNT [..] ss 0x00000000 eflags 0x00000000 eip 0x00001f8c cs 0x00000000 [..]

La dirección es la dirección de la función "inicio" del binario:

cristi:test diciu$ nm ./a.out 0000200c D _NXArgc 00002008 D _NXArgv 00002000 D ___progname 00001fe0 t __dyld_func_lookup 00001000 A __mh_execute_header [..] 00001f8c T start

En Mac OS X, es la función de "inicio" la que se llama primero, incluso antes de la función "principal":

(gdb) b start Breakpoint 1 at 0x1f90 (gdb) b main Breakpoint 2 at 0x1ff4 (gdb) r Starting program: /Users/diciu/Programming/test/a.out Reading symbols for shared libraries ++. done Breakpoint 1, 0x00001f90 in start ()


En lo que respecta a las ventanas, las funciones del punto de entrada son:

  • Consola: void __cdecl mainCRTStartup( void ) {}
  • GUI: void __stdcall WinMainCRTStartup( void ) {}
  • DLL: BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}

La única razón para utilizar estos en el main / WinMain / DllMain normal es si desea utilizar su propia biblioteca de tiempo de ejecución (si desea un tamaño de archivo más pequeño o funciones personalizadas)

Para implementaciones de tiempo de ejecución personalizadas y otros trucos para obtener archivos PE más pequeños, consulte:


Si está interesado en un libro relacionado con la API de Windows y Win32, intente

"Programación de aplicaciones para Microsoft Windows" por Jeffrey Richter.