【问题标题】:Building shared libraries for Ada为 Ada 构建共享库
【发布时间】:2015-10-03 20:03:44
【问题描述】:

我在不使用 GPR 的情况下从 Ada 包构建共享库时遇到了一些问题。

我在文件“numerics.ads”和“numerics.adb”中有一个包 Numerics。他们没有依赖关系。有一个小的构建脚本可以:

gnatmake -Os numerics.ad[bs] -cargs -fPIC
gcc -shared numerics.o -o libnumerics.so -Wl,-soname,libnumerics.so

.so 和 .ali 文件安装在 /usr/lib,.ads 文件安装在 /usr/include。

gnatls -v 输出以下相关部分:

Source Search Path:
    <Current_Directory>
    /usr/include
    /usr/lib/gcc/x86_64-unknown-linux-gnu/5.1.0/adainclude

Object Search Path:
    <Current_Directory>
    /usr/lib
    /usr/lib/gcc/x86_64-unknown-linux-gnu/5.1.0/adalib

所以 GNAT 查找文件应该没有问题。

然后,尝试编译一个依赖 Numerics 的包:

gnatmake -O2 mathematics.ad[bs] -cargs -fPIC

输出:

gcc -c -fPIC mathematics.adb
gcc -c -I./ -fPIC -I- /usr/include/numerics.ads
cannot generate code for file numerics.ads (package spec)
gnatmake: "/usr/include/numerics.ads" compilation error

这个错误让我认为 GNAT 无法识别共享库,并试图重建 Numerics。

我想构建共享库,并且只提供规范用于参考/文档目的。

编辑: 所以,看起来 gprbuild 做了两件我没有做的事情。首先,还将 -lnumerics 传递给编译器。第二个无关紧要,因为 libnumerics.so 无论如何都在标准目录中,它是 -L«ProjectDirectory»。 GPRbuild 显然也没有做预期的行为,即使它正在构建依赖项目。它应该使用已安装的库 /usr/lib/libnumerics.so,而是使用«path»/Numerics/build/libnumerics.so。此外,在使用 GPRbuild 构建 Numerics 之后,然后重命名主体以使其好像主体不存在(就像安装的文件一样),当使用 GPRbuild 构建数学时,它会抱怨完全相同的问题。就好像库甚至没有共享,GPRBuild 只是让它们看起来那样(除了 readelf 报告库中的正确依赖项)。

在构建脚本中添加 -lnumerics 没有任何作用;构建错误完全相同。在这一点上我完全迷失了。

编辑: 按照 Simon 的链接,构建脚本已更改为:

gnatmake -O2 mathematics.ad[bs] \
    -aI/usr/include \
    -aO/usr/lib \
    -cargs -fPIC \
    -largs -lnumerics

错误本质上是一样的:

 gcc -c -O2 -I/usr/include/ -fPIC mathematics.adb
 gcc -c -I./ -O2 -I/usr/include/ -fPIC -I- /usr/include/numerics.ads
 cannot generate code for file numerics.ads (package spec)
 gnatmake: "/usr/include/numerics.ads" compilation error

我想检查一下 libnumerics.so 实际上是一个正确的共享库。 ldd 报告:

 linux-vdso.so.1 (0x00007ffd944c1000)
 libc.so.6 => /usr/lib/libc.so.6 (0x00007f50d3927000)
 /usr/lib64/ld-linux-x86-64.so.2 (0x00007f50d3ed4000)

所以我想是的,图书馆很好,但 gnatmake 仍然无法识别它。

【问题讨论】:

  • 由于 GNAT 是基于源代码的,您必须为您想要使用的任何预编译库提供规范文件。
  • 你不想使用GPR文件来管理共享库的编译和使用的原因是什么? (即使您不想在分布式库中使用 gprbuild,也可以使用它来确定需要哪些标志才能让 GNAT 解决问题。)
  • @JacobSparreAndersen,是的,但是规范文件就在那里,并且呈现出应有的样子。只是缺少了身体,这让我感到困惑。我将尝试设置 GPR 并将 gprbuild 中的标志与我正在做的事情进行比较。
  • @JacobSparreAndersen 所以......我完全迷路了。查看修改。
  • 您可能会发现this answer 很有帮助

标签: compilation shared-libraries ada dynamic-linking


【解决方案1】:

通常,您还需要安装包的主体(在您的情况下为 numerics.adb)。另外,我怀疑你想设置 ALI 文件 (numerics.ali) 是只读的,因此 gnatmake 不会尝试重新编译它们。

【讨论】:

  • 我想确保我也能够构建和分发封闭源代码,因此分发正文不是解决方案。但是,我不知道 ALI 应该是只读的。这解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2017-12-27
  • 2016-09-04
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多