为Ada构建共享库

时间:2015-07-14 23:48:12

标签: compilation shared-libraries ada dynamic-linking

我在使用Ada软件包而不使用GPR的情况下构建共享库时遇到了一些麻烦。

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

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仍然没有意识到它。

1 个答案:

答案 0 :(得分:4)

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