当前位置:首页 » 编程软件 » 编译笔记

编译笔记

发布时间: 2025-03-06 02:11:17

‘壹’ 编译器笔记6-词法分析-有穷自动机

有穷自动机(Finite Automata,FA)由两位神经物理学MeCuloch和Pitts于1948年首先提出,是对 一类处理系统建立的数学模型。这类系统具有一系列离散的输入输出信息和有穷数目的内部状态(状态:概括了对过去输入信息处理的状况)。

系统只需要根据当前所处的状态 和 当前面临的输入信息就可以决定系统的后继行为。每当系统处理了当前的输入后,系统的内部 状态也将发生改变。

电梯控制装置

输入:顾客的乘梯需求(所要到达的层号)
状态:电梯所处的层数+

电梯控制装置并不需要记住先前全部的服务要
求,只需要知道电梯当前所处的状态以及还没
有满足的所有服务请求。

输入带 (input tape) :用来存放输入符号串。

读头 (head) :从左向右逐个读取输入符号,不能修改(只读)、不能往返移动。

有穷控制器 ( finite control ) :具有有穷个状态数,根据当前的
状态和当前输入符号控制转入 下一状态。

确定的FA (Deterministic finite automata, DFA)
非确定的FA (Nondeterministic finite automata, NFA)

M = (S,Σ,δ,s0,F)

例:一个DFA

M = (S,Σ ,δ,s0,F)

M = (S,Σ,δ,s0,F)

例:一个NFA
M = (S,Σ,δ,s0,F)

对任何非确定的有穷自动机N,存在定义同一语言的确定的有穷自动机D。对任何确定的有穷自动机D,存在定义同一语言的非确定的有穷自动机N。

DFA和NFA可以识别相同的语言

M = (S,Σ,δ,s0,F)

从正则表达式到NFA相对直接到DFA比较简单,再从NFA转到DFA。

例 r=(a|b)* abb 对应的NFA

与NFA等价的DFA的每个状态都是NFA状态的一个子集

move(T,a)获得的是一个状态集合U,ε-closure(move(T,a))即为ε-closure(U)对应上表的第二个操作。所以理解上述函数关键是理解closure(T),该操作其实就是求得一个状态集合只通过ε转换得到的另外一个集合。

‘贰’ UE4学习笔记(1):UE源码下载编译+安卓打包

注:该笔记以UE4.27.2在windows平台为例,vs版本为2019

1.关联github和Epic账户

要在github上获取UE4源码需要先关联账户,否则找不到源码,网页404

按照官网提供流程即可完成 GitHub上的虚幻引擎 - Unreal Engine

记得确认邮件,否则还是404(当初就是忘记了,卡了好一会儿)

2.下载UE4源码

在 Releases · EpicGames/UnrealEngine (github.com)中选择自己需要的版本(我使用的是4.27.2),这步很简单,但需要注意的是还需要将Commit.gitdeps.xml文件也一并下载,用于替换同名文件(有些版本则没有这样的文件),不替换的话后续会报错(之后步骤中会提到)

解压后目录如下:

3.执行bat文件

(1)点击运行setup.bat,没有替换Commit.gitdeps.xml文件可能会出现如下问题:

(2)点击运行GenerateProjectFiles.bat,此过程可能会出现如下问题:

未找到框架 .NETFramework Version=v4.6.2

只需要在VS Installer中选中安装就行:

完成后会生成UE4.sln文件

4.生成

VS打开UE4.sln,开始生成:

但是生成过程中我出现了这样的问题:

UE4 fatal error C1076: 编译器限制: 达到内部堆限制

error C3859: 超过了 PCH 的虚拟内存范围问题解决

我出现这样问题的原因是我的C盘空间不够大(分区的时候给的比较少),托管系统设置在C盘,导致无法分配足够的虚拟内存,设置为空间足够的盘即可。

步骤:电脑->属性->高级系统设置->高级->性能设置->高级->更改

OK,成功编译完成

5.安卓打包

该过程有官方文档,并且比较繁琐,直接给出链接:

设置虚幻的Android SDK和NDK | 虚幻引擎文档 (unrealengine.com)

UE部署到Android以及杂症的解决 - 知乎 (hu.com)

我就提一下自己遇到的问题,在UE4中进行安卓打包的时候遇到了这样的问题:

原因在于SetupAndroid.bat中,SDK Platform的版本选择是32,而在UE项目设置->平台 - Android SDK中的SDK API Levle默认选择latest。但是我安装AS的时候默认给我安装了最新的Android API 34(此时latest指向的是34版本),导致冲突。解决方法是UE项目设置中手动设置指定版本,或者在AS中卸载高于32版本的Android API。

OK,打包成功!!!

6.打开游戏

但是,是的,还有但是(都最后一步了,还有问题OVO!!!),在手机上下载安装,打开后是这样的:

原来是因为打包除了生成apk文件还生成了obb,至于Google Play Store Key应该就是一个密钥了。

解决方法是在UE项目设置->Android中勾选“将游戏数据打包至.apk中”,我们可以看到对这个勾选项的解释:

行,勾选后重新打包,成功运行:

‘叁’ OsgEarth学习笔记-新01,从源码编译osgEarth

从源码编译 osgEarth 的学习笔记

学习路径及环境准备

学习路径选定为 osgEarth,以期找到项目工作的突破点。本机环境为 Windows11 64bit,使用 VS 2019 社区版进行开发。由于涉及到OSG第三方依赖,需安装 VC 2017 x64 的编译环境。后续的预编译或源码编译操作均基于 VC2017 版本。

环境搭建步骤

首先,安装 VC2017 编译环境,并下载 Cmake 工具。

其次,从 GitHub 下载 osgEarth 源代码(当前为 3.4 版本)及 OpenSceneGraph(当前为 3.6.5 版本),确保遵循官网对依赖项的要求:OSG 3.6 及以上、GDAL 2.4 及以上、CURL、GEOS 3.2 及以上(可选)。对于 GDAL,考虑到版本兼容性,选择 2.4 版本以避免后续问题。

独立下载 GDAL 及其依赖(CURL 和 GEOS)至 gdal 目录下,并确保正确安装。

对于 Libzip 和 zlib,下载较新版本的源码并编译为库。使用第三方库解决方案以解决与 VS2019+Cmake 的兼容问题。

构建流程

针对 OpenSceneGraph,创建 build 目录并在 Cmake 中指定源码路径与编译选项。关键配置包括 OSG_GL_CONTEXT_VERSION 3.3,以适应 OpenGL 版本要求。

在 osgEarth 的 build 目录下,通过 Cmake-Gui 配置源码路径与关键选项(如 Curl、openthreads)。注意配置 GDAL、osg,并确保 Zip 插件使用较新版的 libzip 库。手动下载 Lerc 源码并解压至指定目录。Sqlite3 与 gdal 包共用。生成、配置并编译项目。

验证编译结果

将编译生成的 dll 等文件放置在指定目录下。通过命令行进入 bin 目录,执行 osgearth_viewer.exe 命令,加载测试文件,确认 osgEarth 正常运行。

总结

从源码编译 osgEarth 的全过程耗时约 8 小时,虽有挑战,但最终成功验证了编译结果。此学习笔记旨在记录整个编译流程,提供参考与后续优化建议。祝大家在开发道路上越走越远。

热点内容
nfslinux挂载 发布:2025-03-06 11:19:42 浏览:231
安卓动态壁纸怎么提取 发布:2025-03-06 11:07:26 浏览:111
有锁安卓手机有什么坏处 发布:2025-03-06 11:00:20 浏览:575
dvwa上传 发布:2025-03-06 10:46:58 浏览:699
新款荣放低配有哪些新配置 发布:2025-03-06 10:41:29 浏览:791
如何给文件上加密 发布:2025-03-06 10:33:09 浏览:371
python类super 发布:2025-03-06 10:32:16 浏览:74
编程代码构成 发布:2025-03-06 10:23:58 浏览:955
如何看一台电视配置 发布:2025-03-06 10:18:08 浏览:253
如何查笔记本电脑配置 发布:2025-03-06 10:17:29 浏览:744