gpt4 book ai didi

compiler-errors - 在 ada 中使用静态库中的包

转载 作者:行者123 更新时间:2023-12-02 10:53:33 26 4
gpt4 key购买 nike

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

所以,在我的主体 main.adb 中,我放了一个

with Services.A;

Service.A 位于外部库(services.a)中,因此我需要在编译过程后链接该库。

我添加了标志 -L/path/of/dir/containing/my/lib-lservices
但是由于类型的声明在 lib 内部并且编译器需要符号,所以我必须包含来自 services.ads 的规范(.ads)。

我看到了多种方法来做到这一点,但我的项目没有任何效果。

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

如果我在我的 gpr 文件中将规范添加到 Sources_Dirs,它会告诉我单元“Services.A”不能属于多个项目。

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

最佳答案

这里有一些东西让你开始。我希望它能给你一个好的方向。

当您将库用于 GPR 时,我知道 3 种情况。
请记住,这不是一个完整的答案,肯定存在更多案例,我可能会忘记一些事情。该主题存在陷阱,因此您应该深入研究互联网、AdaCore/GNAT 文档和 stackoverflow,因为该主题经常被提出。根据您拥有/生成的库的类型以及一些特定的编译/构建/链接选项,此处可能不会涵盖某些上述陷阱。

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

案例一

您可以访问 GPR my_lib.gpr生成库,它是用 Ada 编写的。
只需包含 GPR,在您的代码中您只能使用 with暴露的接口(interface)。 (它对应于 Simon Wright 关于 GPR 中 with "services.gpr"; 的评论)

  • 如果 my_lib.gpr产生一个静态库,没什么可做的! GPR 为您做必要的事情(构建/链接)。
  • 如果 lib 是动态的 (dll),则需要在执行时在 OS 搜索路径中找到该 dll(可执行文件旁边,或在路径环境变量中)

  • 案例二

    您可以访问 GPR my_lib.gpr生成库,它是用另一种语言编写的。
  • 建库
  • 定义另一个 GPR my_lib_install.gpr包含库接口(interface)声明(.ads 文件)。如果文件不存在,请参阅 案例3 .
  • 将该 GPR 引用到您自己的 GPR 项目中
  • 您现在可以使用 .ads 中定义的方法/类型代码中的文件。 .ads通常包含 pragma Import(...)公约宣言。它们被定义一次,所以没有 unit "Services.A" cannot belongs to several projects错误信息。

  • 或者您可以直接将库接口(interface)声明( .ads 文件)包含到您的项目中。
  • 如果 my_lib.gpr生成静态库,您应该包含适当的链接指令以使用 .a 文件。
  • 如果 lib 是动态的 (dll),则需要在执行时在 OS 搜索路径中找到该 dll(可执行文件旁边,或在路径环境变量中)

  • 案例3

    图书馆 my_lib是 COTS,它是用另一种语言编写的。
    它应该与接口(interface)定义一起交付。

    通常的方法是写一个 .ads与提供的契约(Contract)定义相对应的文件。类型和方法应该用一些 pragma Import(...) 标记。对应于库构建方式的约定(Ada 约定,C 约定,参见 ARMthis wiki)

    通常一个接口(interface)契约是一个 .h文件(大多数库都是使用 C 约定生成的)。所以你可以使用 Ada 的 Interfaces.c为此设计的软件包。 this example of interfacing Ada with Java via C convention 中给出了与 C 接口(interface)的示例。 )。主要区别在于您将访问 pragma Import而不是 pragma Export这应该回答:

    Is there any official ways to include the specs like a header in C from an external static library in ada ?



    您可以直接包含此 .ads文件到您的源中,或编写您自己的 GPR 来进行如开头所述的托管。它是由你决定。

    最后一句话,如果您的库是用 Ada 语言编码的,您可能会查看有关详细说明、“初始化”和“最终确定”符号的文档。

    关于compiler-errors - 在 ada 中使用静态库中的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54331783/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com