Compiler errors 在ada中使用静态库中的包

Compiler errors 在ada中使用静态库中的包,compiler-errors,ada,Compiler Errors,Ada,我想使用静态库中的包中的类型和服务 所以,在我的身体里,我放了一个 with Services.A; Service.A位于外部lib services.A中,因此我需要在编译过程之后链接lib 我添加了标志-L/path/of/dir/containing/my/lib和-lservices 但是由于类型声明在lib中,编译器需要符号,所以我必须包含services.ads中的specs.ads 我看到了多种方法来实现这一点,但在我的项目中什么都不起作用 我尝试添加标志-I/path/to/

我想使用静态库中的包中的类型和服务

所以,在我的身体里,我放了一个

with Services.A;
Service.A位于外部lib services.A中,因此我需要在编译过程之后链接lib

我添加了标志-L/path/of/dir/containing/my/lib和-lservices

但是由于类型声明在lib中,编译器需要符号,所以我必须包含services.ads中的specs.ads

我看到了多种方法来实现这一点,但在我的项目中什么都不起作用

我尝试添加标志-I/path/to/ads,但没有成功

如果我在我的gpr文件中添加源目录的规格,它会告诉我unit Services.A不能属于多个项目


是否有任何官方方法可以从ada中的外部静态库中包含规范,如C中的标题?

这里有一些内容供您开始。我希望它能把你带向一个好的方向

当你使用一个库到一个探地雷达,我知道三种情况。 请记住,这不是一个完整的答案,肯定存在更多的情况,我可能会忘记一些事情。该主题容易陷入陷阱,因此您应该深入研究interwebs、AdaCore/GNAT文档和stackoverflow,因为该主题经常被提出。根据您拥有/生成的lib的类型以及一些特定的编译/构建/链接选项,这里可能没有涵盖上述缺陷

前言:当您包含一个静态库时,它唯一的文件名不会告诉您任何有用的信息来调用它所包含的代码。因此,如果静态库是“serivices.a”,那么它只是一个文件名和扩展名。使用Services.A将不足以调用代码

案例1

您可以访问生成库的GPR my_lib.GPR,它是用Ada编写的。 只需包含GPR,在代码中只允许使用公开的接口。它对应于Simon Wright关于with services.gpr的评论;在你的探地雷达中

如果my_lib.gpr生成一个静态库,那么就没有什么可做的了!GPR执行构建/链接所需的操作。 如果库是动态dll,则需要在执行时在可执行文件旁边的OS搜索路径或path环境变量中找到dll 案例2

您可以访问生成库的GPR my_lib.GPR,它是用另一种语言编写的

建图书馆 定义另一个包含库接口声明.ads文件的GPR my_lib_install.GPR。如果文件不存在,请参见案例3。 将该GPR引用到您自己的GPR项目中 现在,您可以在代码中使用.ads文件中定义的方法/类型。.ads通常包含pragma导入。。。公约宣言。它们只定义一次,因此没有单元服务。错误消息:A不能属于多个项目。 也可以直接将库接口声明.ads文件包含到项目中

如果my_lib.gpr生成一个静态库,那么应该包含使用.a文件的适当链接指令。 如果库是动态dll,则需要在执行时在可执行文件旁边的OS搜索路径或path环境变量中找到dll 案例3

库my_lib是一个COTS,它是用另一种语言编写的。 它应该与接口定义一起交付

通常的方法是编写与提供的合同定义对应的.ads文件。类型和方法应该用一些pragma导入标记。。。与库的构建方式相对应的约定Ada约定、C约定,请参见或

通常,接口契约是一个.h文件,大多数库都是按照C约定生成的。因此,您可以使用Ada的Interfaces.c包,这些包就是为此而设计的。中给出了与C接口的示例。主要区别在于您将选择pragma导入而不是pragma导出 这应包括:

是否有任何官方的方法可以像在C中包含标题一样包含规范 来自ada中的外部静态库

您可以直接将这个.ads文件包含到您的源代码中,也可以编写您自己的GPR来进行托管,如开头所示。这取决于你


最后一句话,如果你的库是用Ada语言编码的,你可以看一看关于精化、“初始化”和“最终确定”符号的文档。

你说如果我在gpr文件中添加源目录的规范,它告诉我unit Services.a不能属于多个项目。这一定意味着您的GPR使用services.GPR;或同等产品。请向我们展示两种GPRs。是的,我有一个with services.gpr,以便包含获取我的库接口所需的规范文件。我可以删除此包含项并在main.gpr上仅选择库的*.ads吗?可能。然而,即使是最简单的services.gpr版本也将构建库并使其能够链接到with ing项目中。看见我们无法解决任何具体问题
在我们看到您的项目文件之前,您可能会有!或者是一个类似的简化版本,它显示了同样的问题。例如,你曾多次提到它是一个静态库。这有什么重要的?如果它是一个动态库,会有什么不同?