我想使用位于静态库中的包中的类型和服务。
所以,在我的身体main.adb中,我放了一个
与Services.A;Service.A位于外部库(services.a),…
这里有一些你可以开始的东西。我希望它可以让你朝着一个好方向前进。
当您将库用于GPR时,我知道有3个案例。 请记住,这不是一个完整的答案,肯定存在更多的案例,我可能会忘记一些事情。该主题存在缺陷,因此您应该深入研究interwebs,AdaCore / GNAT文档和stackoverflow,因为这个主题经常被提出。根据您拥有/生成的库的类型以及一些特定的编译/构建/链接选项,这里可能不会涉及一些所述缺陷。
前言:当您包含静态库时,其唯一的文件名不会告诉您调用它包含的代码有什么用处。因此,如果静态库是'serivices.a',它只是一个文件名和扩展名。 with Services.A 将不足以调用代码。
with Services.A
的 情况1 强>
您可以访问GPR my_lib.gpr 它产生了库,它是用Ada编写的。 只需包含GPR,在您的代码中,您将被允许 with 暴露的接口。 (它对应于Simon Wright对此的评论 with "services.gpr"; 在你的GPR)
my_lib.gpr
with
with "services.gpr";
的 案例2 强>
您可以访问GPR my_lib.gpr 它产生了库,它是用另一种语言编写的。
my_lib_install.gpr
.ads
pragma Import(...)
unit "Services.A" cannot belongs to several projects
或者您可以直接包含库接口声明( .ads 文件)进入你的项目。
的 案例3 强>
图书馆 my_lib 是一个COTS,它是用另一种语言编写的。 它应该与接口定义一起提供。
my_lib
通常的方法是写一个 .ads 与提供的合同定义相对应的文件。应该用一些标记类型和方法 pragma Import(...) 对应于库的构建方式的约定(Ada惯例,C约定,见 臂 要么 这个维基 )
通常一个接口契约是一个 .h 文件(大多数库是使用C约定生成的)。所以你可以使用Ada's Interfaces.c 专为此而设计的包装。下面给出了与C接口的一个例子 这个通过C约定将Ada与Java连接起来的例子 )。主要的区别是你会去 pragma Import 代替 pragma Export 这应该是:
.h
Interfaces.c
pragma Import
pragma Export
是否有任何官方方法可以在C中包含标题,如标题 来自ada的外部静态库?
你可以直接包括这个 .ads 将文件放入您的源代码中,或者编写您自己的GPR以执行该托管,如开头所示。它是由你决定。
最后一句话,如果你的图书馆是用Ada语言编写的,你可以看看在有关的文件 阐述 ,'初始化'和'敲定'符号。