ADA静态库——兼容不同版本的编译器

ADA static library - compatibility with different versions of compilers

我已经构建了一个 ADA 静态库,我通过提供“.a”和 ALI 文件来共享它。

当我使用与用于构建静态库的版本相同的 GNAT 编译器版本时,一切正常。

但是使用另一个编译器版本,ALI文件被认为是无效的(编译器版本存储在所有ALI文件中),编译器需要源文件来重建ALI文件。

有没有办法避免这个问题?

更新于 2015 年 12 月 11 日:我们做了一些测试(ALI 库文件处于只读状态),但我们仍然有以下错误:

error: "package1.adb" and "prog.adb" compiled    with different GNAT versions
error: "prog.adb" must be recompiled ("system.ads" has been modified)

所以,我认为我们必须为库和程序使用相同的编译器版本。

如果您使用 gnatmake,请将 ALI 文件设置为只读,这样编译器就不会尝试重新编译它们(您当然有责任确保目标文件兼容,但这通常是例)。

如果您使用的是项目文件,请添加一个

for Externally_Built use "True";

属性达到同样的效果。

来自 AdaCore 的回答:

这不受支持:不能保证 Ada ABI(应用程序二进制接口)在不同版本之间保持相同(并且确实会定期更改),因此您不能混合使用不同版本编译的对象对于 GNAT,您确实需要确保所有库的一致性。

所以,这是不可能的。