AnyMath 文档

包装图像

Julia包映像为Julia包提供对象(本机代码)缓存。 它们类似于朱莉娅的 系统映像并支持许多相同的功能。 实际上,底层序列化格式是相同的,系统映像是构建包映像所依据的基本映像。

高级别概览

包映像是包含代码和数据的共享库。 像 .纪 缓存文件,它们是每个包生成的。 Data部分包含全局数据(包中的全局变量)以及有关包定义的方法和类型的必要元数据。 代码部分包含缓存Julia基于LLVM的编译器的最终输出的本机对象。

命令行选项 --pkgimages=没有 可用于关闭此会话的对象缓存。 请注意,这意味着缓存文件可能必须重新生成。 见 JULIA_MAX_NUM_PRECOMPILE_FILES对于变体的上限Julia每默认缓存。

请注意,虽然包映像将自己呈现为本机共享库,但它们只是其近似值。 您将无法从本机程序链接到它们,它们必须从Julia加载。

连结

由于包映像包含本机代码,我们必须在它们上运行链接器才能使用它们。 您可以设置环境变量 朱莉亚_VERBOSE_LINKING真的 使包图像链接过程详细。

此外,我们不能假设用户安装了工作系统链接器。 因此,Julia随附LLVM链接器LLD,以提供开箱即用的工作体验。 在 基/链接。jl,我们实现了一个有限的接口,以便能够在所有支持的平台上链接包映像。

怪癖

尽管LLD是一个多平台链接器,但它不能提供跨平台的一致接口。 此外,它的目的是从 叮当作响 或者另一个编译器驱动程序,我们因此重新实现了一些逻辑 llvm-项目/clang/lib/驱动程序/工具链. 谢天谢地,人们可以使用 lld-风味 将lld设置为正确的平台

窗户

为了避免不得不处理 链接。exe文件 我们使用 -风味gnu,有效转弯 lld 成来自mingw32环境的交联器。 Windows Dll需要包含 _DllMainCRTStartup 功能,并尽量减少我们对mingw32库的依赖,我们自己注入一个存根定义。

MacOS的

MacOS上的动态库需要链接到 -系统. 在最近的macOS版本上, -系统 仅在Xcode可用时可用于链接。 为此,我们与 -未定义的dynamic_lookup.

针对多个微体系结构优化的封装图像

类似于 多版本控制对于系统映像,包映像支持多版本控制。 如果您在异构环境中,具有统一缓存,则可以设置环境变量 JULIA_CPU_TARGET=泛型 多版本对象缓存。

影响包映像创建和选择的标志

这些是影响缓存选择的Julia命令行标志。 使用不同标志创建的包映像将被拒绝。

* -g, --调试-信息:需要精确匹配,因为它改变了代码生成。 * --检查边界:需要精确匹配,因为它改变了代码生成。 * --内联:需要精确匹配,因为它改变了代码生成。 * --pkgimages:允许在不启用对象缓存的情况下运行。 * -O, --优化:拒绝为较低优化级别生成的包映像,但允许加载较高优化级别。