大理市城乡建设局网站,西安seo黑,衡水seo_衡水网站建设-燕丰收,专业的企业网站设计与编辑初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github#xff1a;codetoys#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C的#xff0c;可以在任何平台上使用。
源码指引#xff1a;github源…初级代码游戏的专栏介绍与文章目录-CSDN博客
我的githubcodetoys所有代码都将会位于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/ 下面是官方说明的重点
压缩包编译
PREFIX/usr/local
VERSION4.2.1
tar xvf mono-$VERSION.tar.xz
cd mono-$VERSION
./configure --prefix$PREFIX
make
make installgit库源码编译
PATH$PREFIX/bin:$PATH
git clone https://github.com/mono/mono.git
cd mono
./autogen.sh --prefix$PREFIX
make
make install
二、为什么要下载整个库 下载了版本包tag那里编译时发现不停地即时下载子模块由于网络原因大家都懂吧这个行为的结果是不确定的所以放弃了改为克隆整个库先在本地获取完整代码。 然后更新子模块子模块会放在external目录下注意我用的是tortoisegit在mono根目录下更新子模块如果在子模块目录下更新子模块则是更新子模块的子模块而且确实存在子模块的子模块。 有三个子模块也有子模块api-doc-tools、bdwgc、linker。 确保全部子模块和子模块的子模块更新成功。
坑如果子模块更新失败 删除子模块的目录再次更新。我希望这只是我用的tortoisegit的问题。
三、上传到ubuntu18.04虚拟机 整个库接近5G大小。 ftp上传需要改sh文件的权限。
坑修改sh权限 最开始当然要修改autogen.sh的权限但是执行会报错逐步操作下来最终需要这么多权限
chmod 755 autogen.sh scripts/*.sh external/bdwgc/autogen.sh 所有操作都在源码树的根目录下进行。源码树里面有个叫“mono”的目录整个库直接下过来默认也是mono目录所以可能有两级mono目录。
四、执行sutogen.sh 命令
./autogen.sh --prefix安装目录 执行过程仍然不太顺利下面是记录
提示mv: cannot stat t-es.gmo: No such file or directory
解决 apt-get install gettext 这个不一定需要在po/mcs目录下创建空文件 t-de.gmo t-es.gmo t-ja.gmo t-pt_BR.gmo
chmod 755 mono/tests/*.sh
子模块corefx是空的删除重新更新子模块后有文件了还有一些空的全部删了重来
chmod 755 mcs/build/start-compiler-server.sh 创建了几个空文件又给几个sh增加了权限。 最终编译完成执行make install安装到指定的目录。
五、验证结果 进到安装后的目录的bin下面执行mono
uservm-ubuntu:~/mono/mono_install_x64/bin$ mono --version
Mono JIT compiler version 6.13.0 (main/0f53e9e151d Mon Oct 21 06:10:39 UTC 2024)
Copyright (C) Novell, Inc, Xamarin Inc and Contributors. www.mono-project.comTLS: __threadSIGSEGV: altstackNotifications: epollArchitecture: amd64Disabled: noneMisc: softdebugInterpreter: yesLLVM: supported, not enabled.Suspend: hybridGC: sgen (concurrent by default)
uservm-ubuntu:~/mono/mono_install_x64/bin$ 显示版本是6.13。
六、交叉编译arm arm64 还在之前源码基础上编译make clean清理掉。似乎不clean可能带来一些问题每次重新搞之前做一下吧。 这个坑就更多了但是麻烦都在编译环境上。我用的一个特定工具链里面很多写死的路径跟我的安装路径不一致一个一个修改了很久最后放弃修改按照写死的路径重建了工具链。 解决了工具链自身的问题剩下的就是参数。之前我们没有使用--host参数交叉编译必须使用--host指定目标这个目标其实就是工具链的文件名前缀检查一下工具链目录就知道了。 因为一开始总是编译不过去我试了很多工具链包括developer.arm.com上下载的官方工具链的几个不同的版本。标准工具链的版本7和附近的几个版本的命名规则里面缺少“OS”部分导致无法识别高版本就没问题。 我下载的几个是这样的 看得出来早期版本命名方式明显不同。我为什么特别选择了版本7呢是因为本地编译的gcc版本是7交叉编译有问题就怀疑是版本不对不过最终是用13.3编译成功的所以7-13应该都是没问题的。 交叉编译用的参数
./autogen.sh --prefix安装目录 --hostarm-none-linux-gnueabihf --host要根据实际的工具链修改标准工具13.3的bin目录下是这样的 一看就明白了吧。 然后make就行了。
坑找不到头文件atomic_ops.h 怎么可能顺顺利利呢。
报错
./include/private/gc_atomic_ops.h:105:11: fatal error: atomic_ops.h: No such file or directory
参见https://github.com/mono/mono/issues/20299
缺少头文件包含路径make增加CFLAGS参数即可解决 坑好大解决了就容易了
make V1 CFLAGS-I/home/user/mono/external/bdwgc/libatomic_ops/src/ -I/home/user/mono/mono/eglib/ 参数V1用来输出编译指令默认是不输出的不方便差错。 增加的头文件包含路径要根据自己需要修改我的源码树的根目录是“/home/user/mono”注意源码树里面有个子目录也叫mono。 然后用标准工具链13.3编译arm32成功、用一个专用工具链编译arm64成功。
七、验证结果 用file检查文件类型类似“ELF 64-bit LSB shared object, ARM aarch64”这样。 上传到设备检查版本
rootubuntu:~# mono_install_arm64/bin/mono --version
Mono JIT compiler version 6.13.0 (main/0f53e9e151d Tue Oct 22 07:29:06 UTC 2024)
Copyright (C) Novell, Inc, Xamarin Inc and Contributors. www.mono-project.comTLS: __threadSIGSEGV: normalNotifications: epollArchitecture: arm64Disabled: noneMisc: softdebugInterpreter: yesLLVM: supported, not enabled.Suspend: preemptiveGC: sgen (concurrent by default)
rootubuntu:~#这里是文档结束