【发布时间】:2011-09-15 18:45:50
【问题描述】:
我希望能够在 linux 系统 (Debian) 上运行用 F# 编写的代码,但我不太可能在其上安装 Mono。有什么方法可以将 F# 编译为完全静态的并且绝对不依赖于 Mono?基本上只是得到一个可执行的二进制文件,我可以像任何其他 linux 二进制文件一样运行它?
【问题讨论】:
我希望能够在 linux 系统 (Debian) 上运行用 F# 编写的代码,但我不太可能在其上安装 Mono。有什么方法可以将 F# 编译为完全静态的并且绝对不依赖于 Mono?基本上只是得到一个可执行的二进制文件,我可以像任何其他 linux 二进制文件一样运行它?
【问题讨论】:
即使在精简帐户上,您也可以编译自己的 Mono 版本 - 这并不是特别难,请参阅 http://www.mono-project.com/Compiling_Mono。有一些依赖项,但它们并不难找到。不过,您需要在大多数运行调用前加上 mono,例如 mono myapp.exe 而不是 ./myapp.exe
【讨论】:
试试AOT。但要注意它的局限性。
更新:
我想我跳得太快了,还没有深入到把它变成有用的东西。 AOT 会将代码预编译到共享库中,在适当的条件下这可能会提高性能。
不过,如果您要求根本不在客户端机器中安装单声道运行时(为什么?),我认为您应该尝试mkbundle / mkbundle2。这将产生一个巨大的自包含可执行文件(C# Hello World + deps 为我的机器生成了一个大约 2.5MB 的文件......使用 -z 我得到了大约 900k)。您可以尝试将其与 Linker 结合使用,以进一步去除您的应用程序所依赖的库中未使用的部分。
至于您的第二个问题,F# 编译器将像任何其他 .NET 编译器一样生成 CIL。所以,应该没关系。尽管如此,如果您的应用程序包含单 AOT 编译器尚不支持的 IL 指令(例如,您需要 mkbundle2 来处理泛型)或对无法安装在 Debian 机器中的外部链接库的依赖项,那么您就不走运了。猜猜你将不得不自己做一些试错操作。
【讨论】: