我想测试Mono AOT,所以我用MonoDevelop编写了一个简单的控制台应用程序:
using System;
namespace abc
{
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
它在bin/debug中创建了一个名为"abc.exe"的文件.当我尝试做的时候:
mono abc.exe
Run Code Online (Sandbox Code Playgroud)
有效.所以,我试着AOT它.我做了:
mono --aot abc.exe
Run Code Online (Sandbox Code Playgroud)
它创建了一个名为abc.exe.so的文件.当我尝试启动它时,它会抛出"Segmentation fault(core dumped)"错误.继承单声道的输出--aot:
Code: 51 Info: 5 Ex Info: 8 Unwind Info: 31 Class Info: 30 PLT: 2 GOT Info: 11 GOT Info Offsets: 16 GOT: 20 Offsets: 48
Compiled 2 out of 3 methods (66%)
1 methods have other problems (33%)
Methods without GOT slots: 1 (33%)
Direct calls: 0 (100%)
JIT time: 1 ms, Generation time: 0 ms, Assembly+Link time: 0 ms.
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
谢谢.
斯科利马说的是对的,他投票结果很奇怪.
您不应该直接使用Mono的AOT编译器生成的输出.
Mono的AOT编译是一个缓存JIT编译输出的过程,并将其保存在Mono运行时根据需要加载的共享库中.生成的.so文件包含预编译的代码和运行时必须使用的元数据.
要使用AOT文件,您只需调用您的程序:
mono program.exe
Mono将从program.exe加载元数据并探测是否存在program.exe.so,以避免在运行时进行即时编译,而是使用.so文件中的代码.相同的过程适用于引用的任何库.
即使是Mono的完整静态编译模式也会生成需要原始.exe文件的代码.
如果你想要实现的是本机可执行文件,你可以尝试使用mkbundle命令将Mono运行时和程序打包成一个可执行文件.
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |