‫你好, 欢迎｡
‫在这堂课中, 我们将了解在Unreal中编译C++文件的主要步骤｡
‫让我们深入了解一下它们是如何工作的｡
‫所以我们很快就要开始使用外部的代码了, 从其他文件中, 我们需要学习C++中是如何工作的｡
‫要做到这一点, 我们需要绕一个小圈子,
‫更详细地了解当我们将C++代码编译成二进制代码时会发生什么｡
‫下面是使用的编译步骤｡
‫我们从你的代码､ C++文件､ 头文件开始, 所有这些都在不同的文本文件中｡
‫这些被输入到一个名为虚幻标题工具的工具中｡
‫现在, 这个工具负责获取所有不真实的特定语法片段, 并使用它们生成更多的C++代码｡
‫让我们看一些例子, 我们在哪里得到了这个不真实的特定语法,
‫这个大写字母的新类是不真实的特定语法, 这里是Crypt Reader API, 那里是生成的主体｡
‫基本上, 这里的情况是, 虚幻头工具会看到你代码中的这些不同的语法片段, 然后说, 好吧,
‫我需要做我的工作｡
‫我得进去, 我得加一堆东西｡
‫它会用一堆代码来替换你生成的身体, 让我们在使用Unreal时更轻松｡
‫它还可以处理U属性和新函数｡
‫它添加了它所需要的所有东西, 这样它就可以与蓝图世界进行交流｡
‫这是第一步｡
‫它将所有不真实的特定内容转换为实际的C++｡
‫一旦我们得到了实际的C++, 我们就可以将其输入到标准的C++编译过程中, 这需要三个步骤｡
‫第一个是处理预处理步骤, 这样它实际上可以触及任何C++语法, 并且实际上只处理以散列开头的行｡
‫我们有一些预处理指令｡
‫这些由预处理器处理｡
‫下一步是我们实际上所称的编译器｡
‫它把一段代码转换成可执行的二进制代码, 但它并没有完全完成这一步, 因为它只对单个的C++,
‫也就是所谓的翻译单元, 基本上是C++文件进行转换｡
‫所以它把一个C++文件单独翻译成二进制文件, 每个单独的C++文件.
‫第三步是连接器, 它将所有这些连接在一起, 并输出一个可执行文件,
‫我们实际上可以运行一个可执行文件｡
‫因此, 让我们通过一个示例文件更详细地了解一下这些标准编译步骤｡
‫想象一下我们有一个博弈｡
‫这是一个非常非常简单的博弈, 因为它所做的就是把一和一加在一起, 但是要把一和一加在一起就必须使用一个函数,
‫这个函数在数学中的另一个文件中声明｡
‫H所以数学证明｡
‫AD, 但它实际上并没有定义它的作用｡
‫所以这是在数学上完成的｡
‫你可以看到这是一个非常简单的实现｡
‫现在, 在预处理器步骤中会发生什么？
‫就像我说的, 它处理任何预处理器指令, 这些指令都是以散列开始的｡
‫哈希函数包含了数学运算, 也就是说把数学运算中的所有内容都复制到这里.
‫它把这两个文件组合在一起, 创建一个新的输出文件, 称为Game
‫I, 基本上是games include, 你可以看到它包含了Master
‫H的定义, 它取代了哈希预处理器指令｡
‫现在博弈II已经有了ADD运算的定义, 然后我们在数学DHCP上运行预处理器｡
‫但是因为它没有任何预处理器指令, 所以基本上没有什么变化｡
‫下一步是编译,
‫这可能是最重要也是最复杂的一步, 因为它所做的是将每个文件中的C++转换为二进制, 但它不是完整的二进制,
‫因为例如, 我的游戏实际上并不知道如何实现AD, 它只知道add函数的形式｡
‫所以这需要在以后填写, 由链接器填写.
‫因此, 链接器将获取为游戏obj文件创建的二进制文件和为主文件创建的二进制文件,
‫并将它们放在一起创建一个游戏｡
‫XY结合了两者的二进制代码, 最终是一个完整的可执行文件, 我们可以运行它,
‫因为它有它所需要的一切的定义｡
‫现在, 为什么我们有这么复杂的过程？
‫这里的想法是, 它加快了我们的编译时间, 因为如果我只做了一个改变｡
‫到游戏DHCP｡
‫我实际上并不需要运行整个编译过程｡
‫我所要做的就是运行涉及游戏DHCP的位,
‫所以我只在CP上运行预处理器, 然后我只在游戏上运行编译器, 这样我就可以重用之前的数学对象文件｡
‫我不需要重新编译它, 因为它没有任何变化｡
‫类似地, 如果我只修改math. CP, 我就不必重新编译游戏obj文件,
‫这就是为什么这是一个更有效的过程, 也是为什么我们首先要这样做的原因｡
‫我想做一个小实验, 试着找出为什么我们要移动一个H和一个CP文件？
‫这是什么原因呢？
‫为什么我们不能只编译C++文件而不包括move？
‫所以我们要做的实验是注释掉散列包含行｡
‫所以用双正斜杠在那一行前面加上注释,
‫这基本上会让它被预处理程序剥离掉, 而不是用文件的内容替换它｡
‫然后我们将重新编译, 我希望你们看一下出现的错误消息, 看看它说了什么,
‫看看你们是否能理解我们使用这个动作的目的｡
‫暂停视频, 开始体验｡
‫好吧, 我会的
‫欢迎回来｡
‫所以我们在这一行的开头加上一个双斜杠, 这基本上使它无效｡
‫然后, 我们将执行一个控制alt f 11, 我们将查看实时编码的输出｡
‫所以, 我们在很早的时候就有了一些错误｡
‫它的意思是你的移动器不是一个类或者命名空间, 下面还有一些其他的东西｡
‫这说明主要技术组件尚未声明super不是一个类或namespace get owner是一个未知标识符｡
‫基本上这就是说你在这里讨论了你的移动者, 但是你没有在任何地方定义它, 你没有在任何地方声明它｡
‫所以我也不知道｡
‫C++编译器说, 我不知道这是什么｡
‫这就是为什么我们是哈希的, 包括移动者H, 因为移动者H声明了类.
‫它说U移动器是一个类, 它从你的行为中派生出来, 一个组件, 它有这些方法, 等等.
‫它是在宣告成为那个阶级意味着什么｡
‫因此, 如果没有该声明, C++编译器将无法继续｡
‫这就是为什么我们需要包括头文件｡
‫好东西｡
‫所以希望你现在能更好地理解C++的编译过程, 特别是在Unreal中的C++编译｡
‫我们下节课再见｡