﻿1
00:00:04,370 --> 00:00:05,630
‫Olá e bem-vindo.

2
00:00:05,630 --> 00:00:13,160
‫Nesta palestra, vamos entender as principais etapas envolvidas na compilação de arquivos C++ no

3
00:00:13,160 --> 00:00:13,730
‫Unreal.

4
00:00:13,940 --> 00:00:15,770
‫Vamos mergulhar e ver como eles funcionam.

5
00:00:16,910 --> 00:00:23,990
‫Então, em breve será a hora de começarmos a usar código de fora, de outros arquivos, e precisamos

6
00:00:23,990 --> 00:00:26,720
‫aprender como isso funciona em C++.

7
00:00:26,720 --> 00:00:31,190
‫Para fazer isso, precisamos fazer um pequeno desvio e entender com mais detalhes

8
00:00:31,190 --> 00:00:35,240
‫o que está acontecendo quando compilamos nosso código C++ em binário.

9
00:00:35,240 --> 00:00:38,390
‫Então, aqui estão as etapas de compilação que são usadas.

10
00:00:38,750 --> 00:00:44,450
‫Começamos com seu código, seus arquivos C++, seu cabeçalho de arquivos, tudo em vários arquivos de texto.

11
00:00:44,900 --> 00:00:49,010
‫Estes são alimentados em uma ferramenta chamada Unreal Handed Tool.

12
00:00:49,010 --> 00:00:56,210
‫Agora, essa ferramenta é responsável por pegar todas as partes específicas irreais da sintaxe e usá-las

13
00:00:56,210 --> 00:00:58,490
‫para gerar mais código C++.

14
00:00:58,910 --> 00:01:05,480
‫Então, vamos dar uma olhada em alguns exemplos de onde temos essa sintaxe específica irreal, essa nova classe

15
00:01:05,540 --> 00:01:13,640
‫em letras maiúsculas que é uma sintaxe específica irreal, e assim é a coisa da API Crypt Reader aqui e o

16
00:01:13,640 --> 00:01:15,170
‫corpo gerado ali.

17
00:01:15,530 --> 00:01:21,770
‫E basicamente o que está acontecendo aqui é que a ferramenta de cabeçalho irreal verá essas diferentes partes da sintaxe em

18
00:01:21,770 --> 00:01:24,470
‫seu código e dirá, ok, preciso fazer meu trabalho.

19
00:01:24,470 --> 00:01:26,810
‫Eu preciso ir lá, eu preciso adicionar um monte de coisas.

20
00:01:27,080 --> 00:01:33,710
‫Ele vai substituir seu corpo gerado por um monte de código que facilita nossas vidas ao usar o

21
00:01:33,710 --> 00:01:34,460
‫Unreal.

22
00:01:35,060 --> 00:01:38,240
‫Ele também faz coisas como as propriedades U e funções U.

23
00:01:38,240 --> 00:01:43,340
‫Ele adiciona todas as coisas de que precisa para poder se comunicar com o mundo do projeto.

24
00:01:43,730 --> 00:01:44,960
‫Então esse é o primeiro passo.

25
00:01:44,960 --> 00:01:49,010
‫Ele converte todas as suas coisas específicas irreais em C++ real.

26
00:01:49,580 --> 00:01:55,820
‫Uma vez que tenhamos o C++ real, podemos alimentá-lo em um processo de compilação C++ padrão, que

27
00:01:55,820 --> 00:01:56,990
‫leva três etapas.

28
00:01:57,380 --> 00:02:04,370
‫A primeira é lidar com a etapa de pré-processamento, então isso realmente tocará qualquer sintaxe C++ e, na verdade, lidará

29
00:02:04,640 --> 00:02:07,580
‫apenas com linhas que começam com um hash.

30
00:02:07,580 --> 00:02:10,610
‫Temos algumas dessas diretivas de pré-processamento.

31
00:02:10,940 --> 00:02:13,220
‫Estes são tratados pelo pré-processador.

32
00:02:14,120 --> 00:02:16,610
‫O próximo passo é o que chamamos de compilador.

33
00:02:16,880 --> 00:02:24,620
‫Ele pega um código e o converte em binário executável, mas não completa o passo porque só

34
00:02:24,620 --> 00:02:31,640
‫o faz em C++ individuais, que são conhecidos como unidades de tradução, basicamente arquivos C++.

35
00:02:31,880 --> 00:02:37,670
‫Portanto, ele pega um arquivo C++ e o traduz em binário individualmente, cada arquivo C++ individual.

36
00:02:38,000 --> 00:02:44,300
‫E então a terceira etapa é o linker, que reúne tudo isso e gera um executável que

37
00:02:44,300 --> 00:02:46,850
‫podemos realmente executar um único executável.

38
00:02:47,330 --> 00:02:52,730
‫Então, vamos dar uma olhada nessas etapas de compilação padrão com um pouco mais de detalhes com um arquivo de

39
00:02:53,060 --> 00:02:53,540
‫exemplo.

40
00:02:53,990 --> 00:03:00,200
‫Então imagine que tivéssemos um jogo ponto CP e é um jogo muito, muito simples, porque tudo o que ele faz é adicionar um

41
00:03:00,200 --> 00:03:01,160
‫e um juntos.

42
00:03:01,640 --> 00:03:07,790
‫Mas para somar um e um, ele está tendo que usar uma função que está declarada em um arquivo diferente na

43
00:03:07,790 --> 00:03:08,630
‫matemática dois.

44
00:03:08,690 --> 00:03:13,850
‫H Portanto, a matemática declara ad, mas na verdade não define o que ela faz.

45
00:03:14,240 --> 00:03:16,790
‫Então, isso é feito na etapa de pontos matemáticos.

46
00:03:16,790 --> 00:03:19,250
‫E você pode ver que é uma implementação muito simples.

47
00:03:20,090 --> 00:03:22,640
‫Agora, o que acontece na etapa de pré-processamento?

48
00:03:22,640 --> 00:03:28,040
‫Bem, como eu disse, ele lida com quaisquer diretivas de pré-processador, que são coisas que começam com um

49
00:03:28,040 --> 00:03:28,610
‫hash.

50
00:03:28,610 --> 00:03:34,700
‫Portanto, o hash inclui matemática, o que basicamente significa apenas copiar tudo no Master H aqui.

51
00:03:35,120 --> 00:03:40,640
‫Então, o que ele faz é pegar esses dois arquivos e combiná-los para criar um novo arquivo

52
00:03:40,640 --> 00:03:46,190
‫de saída chamado game dot eu basicamente jogo para incluir e você pode ver que ele está incluído.

53
00:03:46,490 --> 00:03:52,700
‫A definição de masturbação substituiu a diretiva do pré-processador de hash.

54
00:03:52,700 --> 00:04:02,540
‫Então agora o game dot II tem uma definição para a operação add e então rodamos o pré-processador no math dot

55
00:04:02,540 --> 00:04:03,170
‫CVP.

56
00:04:03,170 --> 00:04:07,490
‫Mas como ele não possui diretivas de pré-processador, basicamente nada é alterado lá.

57
00:04:08,150 --> 00:04:12,830
‫O próximo passo é que a compilação é provavelmente o passo mais

58
00:04:12,830 --> 00:04:21,290
‫importante e complicado, porque o que ele faz é pegar aquele C++ em cada arquivo individual e convertê-lo em binário, mas não

59
00:04:21,290 --> 00:04:28,610
‫é um binário completo porque, por exemplo, meu jogo não sabe como implementar e sabe apenas a forma dessa

60
00:04:28,850 --> 00:04:30,350
‫função de adição.

61
00:04:30,770 --> 00:04:34,940
‫Então, isso precisa ser preenchido mais tarde e é preenchido pelo vinculador.

62
00:04:34,970 --> 00:04:40,880
‫Então o link vai pegar o binário, cria-lo para o arquivo dot obj do jogo e o binário

63
00:04:40,880 --> 00:04:47,060
‫criado para o arquivo do método e reuni-los para fazer um jogo dot xy que combina o binário

64
00:04:47,360 --> 00:04:54,410
‫para ambos e finalmente é um executável completo que nós pode realmente funcionar porque tem a definição para tudo o que

65
00:04:54,410 --> 00:04:55,040
‫precisa.

66
00:04:55,340 --> 00:04:58,460
‫Agora, por que temos um processo tão complicado?

67
00:04:58,820 --> 00:05:02,060
‫A ideia aqui é que isso acelere nosso tempo de compilação.

68
00:05:02,060 --> 00:05:03,850
‫Porque se eu apenas fizesse uma corrente.

69
00:05:04,340 --> 00:05:06,230
‫Para jogar dot sleep.

70
00:05:06,770 --> 00:05:10,290
‫Na verdade, não preciso executar todo o processo de compilação.

71
00:05:10,310 --> 00:05:16,610
‫Tudo o que tenho que fazer é rodar os bits envolvendo o game dot CBP, então eu rodaria o pré-processador apenas no CP.

72
00:05:16,790 --> 00:05:19,280
‫Então eu executaria o compilador apenas no jogo para I.

73
00:05:19,280 --> 00:05:23,510
‫E então eu posso reutilizar o arquivo obj de ponto matemático de antes.

74
00:05:23,690 --> 00:05:26,810
‫Eu não preciso recompilá-lo porque nada mudou nisso.

75
00:05:27,080 --> 00:05:33,170
‫Da mesma forma, se eu alterar apenas o math dot CP, não precisaria recompilar o jogo para o arquivo OBJ, e é por isso

76
00:05:33,170 --> 00:05:37,370
‫que esse é um processo mais eficiente e por que estamos fazendo isso em primeiro lugar.

77
00:05:37,730 --> 00:05:44,330
‫Então, eu gostaria que fizéssemos um pequeno experimento e tentasse descobrir por que incluímos mover um ponto h e mover

78
00:05:44,330 --> 00:05:46,070
‫seu arquivo de ponto CP?

79
00:05:46,370 --> 00:05:47,690
‫Qual é a razão disso?

80
00:05:47,700 --> 00:05:52,040
‫Por que não podemos simplesmente compilar o arquivo C++ sem incluir move dot h.

81
00:05:52,340 --> 00:05:56,540
‫Então, o experimento que vamos fazer é comentar a linha de inclusão de hash.

82
00:05:56,690 --> 00:06:01,940
‫Portanto, usando uma barra dupla para fazer um comentário na frente dessa linha, o que

83
00:06:01,940 --> 00:06:07,280
‫basicamente fará com que seja removido pelo pré-processador em vez do pré-processador substituindo-o pelo conteúdo do

84
00:06:07,280 --> 00:06:07,880
‫arquivo.

85
00:06:08,570 --> 00:06:15,020
‫Em seguida, vamos recompilar e gostaria que você desse uma olhada nas mensagens de erro que aparecem e veja

86
00:06:15,020 --> 00:06:20,870
‫o que diz para ver se você pode tentar entender para que estamos incluindo essa mudança.

87
00:06:21,350 --> 00:06:23,210
‫Pause o vídeo e vá em frente.

88
00:06:26,500 --> 00:06:26,980
‫OK.

89
00:06:26,980 --> 00:06:27,760
‫Bem vindo de volta.

90
00:06:28,150 --> 00:06:33,220
‫Então, vamos colocar uma barra dupla no início desta linha, o que basicamente a torna nula e sem

91
00:06:33,220 --> 00:06:33,580
‫efeito.

92
00:06:34,030 --> 00:06:40,300
‫E então vamos fazer um controle alt f 11 e vamos dar uma olhada na saída da codificação ao vivo.

93
00:06:40,480 --> 00:06:44,650
‫Então veja, nós temos alguns erros logo no início.

94
00:06:44,650 --> 00:06:50,680
‫E o que está dizendo é que você move não é uma classe ou namespace e há algumas outras coisas aqui

95
00:06:50,680 --> 00:06:51,070
‫embaixo.

96
00:06:51,070 --> 00:06:56,650
‫Está dizendo que o componente de tecnologia primária foi declarado super está na classe ou o proprietário do namespace

97
00:06:56,650 --> 00:06:58,090
‫é um identificador desconhecido.

98
00:06:58,510 --> 00:07:03,880
‫E basicamente o que isso está dizendo é que você falou sobre você se mudar para cá, mas você não definiu de

99
00:07:03,880 --> 00:07:05,860
‫qualquer maneira, você não declarou em lugar nenhum.

100
00:07:05,860 --> 00:07:07,150
‫Então eu não sei.

101
00:07:07,180 --> 00:07:11,290
‫O compilador C++ diz, eu não sei o que é isso.

102
00:07:11,680 --> 00:07:18,160
‫Então é por isso que somos hash incluindo o movedor dot h porque mova-o ou H declara a classe.

103
00:07:18,160 --> 00:07:25,720
‫Ele diz que um motor U é uma classe e deriva de você agir como um componente e tem esses métodos, etc.

104
00:07:25,720 --> 00:07:28,270
‫está declarando o que significa ser essa classe.

105
00:07:28,630 --> 00:07:35,260
‫Portanto, sem essa declaração, o compilador C++ não pode continuar e é por isso que precisamos incluir esse arquivo de

106
00:07:35,260 --> 00:07:35,920
‫cabeçalho.

107
00:07:36,760 --> 00:07:37,180
‫Coisas boas.

108
00:07:37,180 --> 00:07:44,860
‫Espero que agora você entenda um pouco melhor o processo envolvido na compilação de C++ e particularmente

109
00:07:44,860 --> 00:07:47,650
‫na compilação de C++ no Unreal.

110
00:07:47,920 --> 00:07:49,570
‫Vejo você na próxima palestra.

