初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
坑多。
目录
一、源码下载
二、为什么要下载整个库
坑,如果子模块更新失败
三、上传到ubuntu18.04虚拟机
坑,修改sh权限
四、执行sutogen.sh
五、验证结果
六、交叉编译arm arm64
坑,找不到头文件atomic_ops.h
七、验证结果
上git下载源码,GitHub - mono/mono: Mono open source ECMA CLI, C# and .NET implementation.
我下载了整个库,由于编译版本包遇到问题,后面的操作都是基于版本库的。
官方编译说明在(链接来自README.md) https://www.mono-project.com/docs/compiling-mono/linux/
下面是官方说明的重点:
下载了版本包(tag那里)编译时发现不停地即时下载子模块,由于网络原因(大家都懂吧),这个行为的结果是不确定的,所以放弃了,改为克隆整个库,先在本地获取完整代码。
然后更新子模块,子模块会放在external目录下(注意,我用的是tortoisegit,在mono根目录下更新子模块,如果在子模块目录下更新子模块则是更新子模块的子模块,而且确实存在子模块的子模块!)。
有三个子模块也有子模块:api-doc-tools、bdwgc、linker。
确保全部子模块和子模块的子模块更新成功。
删除子模块的目录,再次更新。我希望这只是我用的tortoisegit的问题。
整个库接近5G大小。
ftp上传需要改sh文件的权限。
最开始当然要修改autogen.sh的权限,但是执行会报错,逐步操作下来最终需要这么多权限:
所有操作都在源码树的根目录下进行。源码树里面有个叫“mono”的目录,整个库直接下过来默认也是mono目录,所以可能有两级mono目录。
命令:
执行过程仍然不太顺利,下面是记录:
创建了几个空文件,又给几个sh增加了权限。
最终编译完成,执行make install安装到指定的目录。
进到安装后的目录的bin下面,执行mono:
显示版本是6.13。
还在之前源码基础上编译,make clean清理掉。似乎不clean可能带来一些问题,每次重新搞之前做一下吧。
这个坑就更多了,但是麻烦都在编译环境上。我用的一个特定工具链里面很多写死的路径,跟我的安装路径不一致,一个一个修改了很久,最后放弃修改,按照写死的路径重建了工具链。
解决了工具链自身的问题,剩下的就是参数。之前我们没有使用--host参数,交叉编译必须使用--host指定目标,这个目标其实就是工具链的文件名前缀,检查一下工具链目录就知道了。
因为一开始总是编译不过去,我试了很多工具链,包括developer.arm.com上下载的官方工具链的几个不同的版本。标准工具链的版本7(和附近的几个版本)的命名规则里面缺少“OS”部分,导致无法识别,高版本就没问题。
我下载的几个是这样的:
看得出来早期版本命名方式明显不同。我为什么特别选择了版本7呢?是因为本地编译的gcc版本是7,交叉编译有问题就怀疑是版本不对,不过最终是用13.3编译成功的,所以7-13应该都是没问题的。
交叉编译用的参数:
--host要根据实际的工具链修改,标准工具13.3的bin目录下是这样的:
一看就明白了吧。
然后make就行了。
怎么可能顺顺利利呢。
坑好大,解决了就容易了:
参数V=1用来输出编译指令,默认是不输出的,不方便差错。
增加的头文件包含路径要根据自己需要修改,我的源码树的根目录是“/home/user/mono”,注意源码树里面有个子目录也叫mono。
然后用标准工具链13.3编译arm32成功、用一个专用工具链编译arm64成功。
用file检查文件类型,类似“ELF 64-bit LSB shared object, ARM aarch64”这样。
上传到设备,检查版本:
(这里是文档结束)
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/6547.html