﻿1
00:00:04,370 --> 00:00:05,630
‫Hola y bienvenido.

2
00:00:05,630 --> 00:00:13,160
‫En esta lección, vamos a comprender los pasos principales involucrados en la compilación de archivos C++ en

3
00:00:13,160 --> 00:00:13,730
‫Unreal.

4
00:00:13,940 --> 00:00:15,770
‫Vamos a sumergirnos y ver cómo funcionan.

5
00:00:16,910 --> 00:00:23,990
‫Así que pronto será el momento de que empecemos a usar código externo, de otros archivos, y necesitamos

6
00:00:23,990 --> 00:00:26,720
‫aprender cómo funciona esto en C++.

7
00:00:26,720 --> 00:00:31,190
‫Para hacer eso, necesitamos desviarnos un poco y comprender con más detalle

8
00:00:31,190 --> 00:00:35,240
‫lo que sucede cuando compilamos nuestro código C++ en binario.

9
00:00:35,240 --> 00:00:38,390
‫Así que aquí están los pasos de compilación que se utilizan.

10
00:00:38,750 --> 00:00:44,450
‫Comenzamos con su código, sus archivos C++, su encabezado de archivos, todo en varios archivos de texto.

11
00:00:44,900 --> 00:00:49,010
‫Estos se introducen en una herramienta llamada Unreal Handed Tool.

12
00:00:49,010 --> 00:00:56,210
‫Ahora, esta herramienta es responsable de tomar todas las piezas de sintaxis específicas e irreales y usarlas

13
00:00:56,210 --> 00:00:58,490
‫para generar más código C++.

14
00:00:58,910 --> 00:01:05,480
‫Entonces, echemos un vistazo a algunos ejemplos de dónde tenemos esta sintaxis específica irreal, esta nueva clase

15
00:01:05,540 --> 00:01:13,640
‫en letras mayúsculas que es una sintaxis específica irreal, y también lo es la API de Crypt Reader aquí y el

16
00:01:13,640 --> 00:01:15,170
‫cuerpo generado allí.

17
00:01:15,530 --> 00:01:21,770
‫Y básicamente lo que está pasando aquí es que la herramienta de encabezado irreal verá estas diferentes piezas de sintaxis en su

18
00:01:21,770 --> 00:01:24,470
‫código y dirá, está bien, necesito hacer mi trabajo.

19
00:01:24,470 --> 00:01:26,810
‫Necesito ir allí, necesito agregar un montón de cosas.

20
00:01:27,080 --> 00:01:33,710
‫Reemplazará su cuerpo generado con un montón de código que nos facilita la vida cuando usamos

21
00:01:33,710 --> 00:01:34,460
‫Unreal.

22
00:01:35,060 --> 00:01:38,240
‫También hace cosas como las propiedades U y las funciones U.

23
00:01:38,240 --> 00:01:43,340
‫Agrega todo lo que necesita para poder comunicarse con el mundo de los planos.

24
00:01:43,730 --> 00:01:44,960
‫Así que ese es el primer paso.

25
00:01:44,960 --> 00:01:49,010
‫Convierte todas sus cosas específicas irreales en C++ real.

26
00:01:49,580 --> 00:01:55,820
‫Una vez que tenemos el C++ real, podemos introducirlo en un proceso de compilación de C++ estándar, que consta

27
00:01:55,820 --> 00:01:56,990
‫de tres pasos.

28
00:01:57,380 --> 00:02:04,370
‫El primero es lidiar con el paso de preprocesamiento, por lo que en realidad tocará cualquiera de la sintaxis de C ++ y en

29
00:02:04,640 --> 00:02:07,580
‫realidad solo trata con líneas que comienzan con un hash.

30
00:02:07,580 --> 00:02:10,610
‫Así que tenemos algunas de estas directivas de preprocesamiento.

31
00:02:10,940 --> 00:02:13,220
‫Estos son tratados por el preprocesador.

32
00:02:14,120 --> 00:02:16,610
‫El siguiente paso es lo que en realidad llamamos el compilador.

33
00:02:16,880 --> 00:02:24,620
‫Toma un código y lo convierte en binario ejecutable, pero no completa del todo el paso porque solo

34
00:02:24,620 --> 00:02:31,640
‫lo hace en C++ individuales, lo que se conoce como unidades de traducción, básicamente archivos C++.

35
00:02:31,880 --> 00:02:37,670
‫Así que toma un archivo C++ y lo traduce a binario individualmente, cada archivo C++ individual.

36
00:02:38,000 --> 00:02:44,300
‫Y luego, el tercer paso es el enlazador, que reúne todo eso y genera un ejecutable que en

37
00:02:44,300 --> 00:02:46,850
‫realidad podemos ejecutar como un solo ejecutable.

38
00:02:47,330 --> 00:02:52,730
‫Así que echemos un vistazo a estos pasos de compilación estándar con un poco más de detalle con un archivo de

39
00:02:53,060 --> 00:02:53,540
‫ejemplo.

40
00:02:53,990 --> 00:03:00,200
‫Así que imagina que tuviéramos un juego punto CP y es un juego muy, muy simple porque todo lo que hace es sumar

41
00:03:00,200 --> 00:03:01,160
‫uno más uno.

42
00:03:01,640 --> 00:03:07,790
‫Pero para sumar uno y uno juntos, tiene que usar una función que está declarada en un archivo diferente en las

43
00:03:07,790 --> 00:03:08,630
‫matemáticas dos.

44
00:03:08,690 --> 00:03:13,850
‫H Así que las matemáticas declaran ad, pero en realidad no definen lo que hace.

45
00:03:14,240 --> 00:03:16,790
‫Así que eso se vuelve a hacer en el paso de puntos matemáticos.

46
00:03:16,790 --> 00:03:19,250
‫Y puede ver que es una implementación muy simple.

47
00:03:20,090 --> 00:03:22,640
‫Ahora, ¿qué sucede en el paso de preprocesamiento?

48
00:03:22,640 --> 00:03:28,040
‫Bueno, como dije, se ocupa de las directivas de preprocesador, que son cosas que comienzan con un

49
00:03:28,040 --> 00:03:28,610
‫hash.

50
00:03:28,610 --> 00:03:34,700
‫Entonces, el hash incluye matemáticas, lo que básicamente significa simplemente copiar todo en Master H aquí.

51
00:03:35,120 --> 00:03:40,640
‫Entonces, lo que hace es tomar estos dos archivos y los combina para crear un

52
00:03:40,640 --> 00:03:46,190
‫nuevo archivo de salida llamado game dot. Básicamente juego para incluir y puedes ver que está incluido.

53
00:03:46,490 --> 00:03:52,700
‫La definición de masturbación ha reemplazado la directiva del preprocesador hash.

54
00:03:52,700 --> 00:04:02,540
‫Así que ahora game dot II tiene una definición para la operación de adición y luego ejecutamos el preprocesador en math dot

55
00:04:02,540 --> 00:04:03,170
‫CVP.

56
00:04:03,170 --> 00:04:07,490
‫Pero debido a que no tiene directivas de preprocesador, básicamente no se cambia nada allí.

57
00:04:08,150 --> 00:04:12,830
‫El siguiente paso es la compilación, es probablemente el paso más importante y

58
00:04:12,830 --> 00:04:21,290
‫complicado, porque lo que hace es tomar ese C++ en cada archivo individual y convertirlo en binario, pero no es un binario

59
00:04:21,290 --> 00:04:28,610
‫completo porque, por ejemplo, mi juego en realidad no sabe cómo implementar y solo conoce la forma de esa

60
00:04:28,850 --> 00:04:30,350
‫función de agregar.

61
00:04:30,770 --> 00:04:34,940
‫Eso debe completarse más tarde y el enlazador lo completa.

62
00:04:34,970 --> 00:04:40,880
‫Entonces, el enlace tomará el binario, lo creará para el archivo game dot obj y el binario creado

63
00:04:40,880 --> 00:04:47,060
‫para el archivo de método y los juntará para crear un game dot xy que combina el binario

64
00:04:47,360 --> 00:04:54,410
‫para ambos y finalmente es un ejecutable completo que nosotros en realidad puede ejecutarse porque tiene la definición de todo lo que

65
00:04:54,410 --> 00:04:55,040
‫necesita.

66
00:04:55,340 --> 00:04:58,460
‫Ahora bien, ¿por qué tenemos un proceso tan complicado?

67
00:04:58,820 --> 00:05:02,060
‫La idea aquí es que acelera nuestro tiempo de compilación.

68
00:05:02,060 --> 00:05:03,850
‫Porque si solo hiciera una cadena.

69
00:05:04,340 --> 00:05:06,230
‫Para jugar dot sleep.

70
00:05:06,770 --> 00:05:10,290
‫En realidad, no necesito ejecutar todo el proceso de compilación.

71
00:05:10,310 --> 00:05:16,610
‫Todo lo que tengo que hacer es ejecutar los bits relacionados con Game Dot CBP, por lo que ejecutaría el preprocesador solo en el CP.

72
00:05:16,790 --> 00:05:19,280
‫Luego ejecutaría el compilador solo en el juego para I.

73
00:05:19,280 --> 00:05:23,510
‫Y luego puedo reutilizar el archivo obj de puntos matemáticos de antes.

74
00:05:23,690 --> 00:05:26,810
‫No necesito volver a compilarlo porque nada ha cambiado en eso.

75
00:05:27,080 --> 00:05:33,170
‫Del mismo modo, si solo cambio el CP del punto matemático, no tendría que volver a compilar el juego en un archivo OBJ, por lo

76
00:05:33,170 --> 00:05:37,370
‫que este es un proceso más eficiente y por lo que lo estamos haciendo en primer lugar.

77
00:05:37,730 --> 00:05:44,330
‫Así que me gustaría que hiciéramos un pequeño experimento e intentáramos averiguar por qué incluimos move a doth in y

78
00:05:44,330 --> 00:05:46,070
‫movemos su archivo dot CP.

79
00:05:46,370 --> 00:05:47,690
‫¿Cuál es la razón de ello?

80
00:05:47,700 --> 00:05:52,040
‫¿Por qué no podemos simplemente compilar el archivo C++ sin incluir move dot h.

81
00:05:52,340 --> 00:05:56,540
‫Entonces, el experimento que vamos a hacer es comentar la línea de inclusión hash.

82
00:05:56,690 --> 00:06:01,940
‫Entonces, usar una barra diagonal doble para hacer un comentario delante de esa línea, lo que básicamente

83
00:06:01,940 --> 00:06:07,280
‫hará que el preprocesador lo elimine en lugar de que el preprocesador lo reemplace con el contenido del

84
00:06:07,280 --> 00:06:07,880
‫archivo.

85
00:06:08,570 --> 00:06:15,020
‫Luego vamos a volver a compilar y me gustaría que eches un vistazo a los mensajes de error que aparecen

86
00:06:15,020 --> 00:06:20,870
‫y veas lo que dice para ver si puedes tratar de entender para qué estamos incluyendo este movimiento.

87
00:06:21,350 --> 00:06:23,210
‫Pausa el video y pruébalo.

88
00:06:26,500 --> 00:06:26,980
‫Bueno.

89
00:06:26,980 --> 00:06:27,760
‫Bienvenido de nuevo.

90
00:06:28,150 --> 00:06:33,220
‫Así que pongamos una barra inclinada doble al comienzo de esta línea, lo que básicamente la anula y no tiene

91
00:06:33,220 --> 00:06:33,580
‫valor.

92
00:06:34,030 --> 00:06:40,300
‫Y luego vamos a hacer un control alt f 11 y vamos a echar un vistazo a la salida de la codificación en vivo.

93
00:06:40,480 --> 00:06:44,650
‫Así que mira, tenemos algunos errores muy, muy pronto.

94
00:06:44,650 --> 00:06:50,680
‫Y lo que está diciendo es que tu mover no es una clase o un espacio de nombres y hay algunas otras cosas aquí

95
00:06:50,680 --> 00:06:51,070
‫abajo.

96
00:06:51,070 --> 00:06:56,650
‫Está diciendo que el componente tecnológico principal ha sido declarado super está en la clase o que el propietario del espacio de

97
00:06:56,650 --> 00:06:58,090
‫nombres es un identificador desconocido.

98
00:06:58,510 --> 00:07:03,880
‫Y básicamente lo que esto quiere decir es que ha hablado de su motor aquí, pero no lo ha definido de todos

99
00:07:03,880 --> 00:07:05,860
‫modos, no lo ha declarado en ninguna parte.

100
00:07:05,860 --> 00:07:07,150
‫Así que no lo sé.

101
00:07:07,180 --> 00:07:11,290
‫El compilador de C++ dice, no sé qué es esto.

102
00:07:11,680 --> 00:07:18,160
‫Entonces es por eso que estamos incluyendo hash el mover dot h porque muévelo o H declara la clase.

103
00:07:18,160 --> 00:07:25,720
‫Dice que un motor U es una clase y se deriva de que actúas como un componente y tiene estos métodos, etc.

104
00:07:25,720 --> 00:07:28,270
‫está declarando lo que significa ser esa clase.

105
00:07:28,630 --> 00:07:35,260
‫Entonces, sin esa declaración, el compilador de C++ no puede continuar y es por eso que necesitamos incluir ese archivo de

106
00:07:35,260 --> 00:07:35,920
‫encabezado.

107
00:07:36,760 --> 00:07:37,180
‫Buena cosa.

108
00:07:37,180 --> 00:07:44,860
‫Así que espero que ahora entiendas un poco mejor el proceso involucrado en la compilación de C++ y particularmente

109
00:07:44,860 --> 00:07:47,650
‫la compilación de C++ en Unreal.

110
00:07:47,920 --> 00:07:49,570
‫Te veré en la próxima conferencia.

