【问题标题】:How to exclude with GPRbuild some functions?如何用 GPRbuild 排除一些功能?
【发布时间】:2019-07-13 05:21:34
【问题描述】:

我在 Ada 中有一个使用 gprbuild 编译的可执行文件。该可执行文件使用一些简单的功能(如 sin e cos)。该可执行文件在绑定到使用 vxwork 设计的 POS(分区操作系统)的应用程序中运行。重新编译整个过程后,会在 POS_API.o 和 ada 可执行文件 (hello.o) 之间出现一堆多函数声明错误。这些函数(sin、cos、...)都在同一个库中。不幸的是,不允许在 POS 中取消引用所有这些功能的最简单的解决方案(设计界限)。关于如何编译或继续的任何建议? 是否有可能在没有特定库或某些函数的情况下进行编译以避免多重引用错误?

【问题讨论】:

  • 有没有关于如何用 C 解决同样问题的 VxWorks 文档?我很惊讶在.o 文件中发现了一个可执行文件,但是我已经很久没有使用VxWorks(5.4)了,那时不可能有这样的事情。也许您需要从您的 Ada 源而不是可执行文件构建一个库。
  • @SimonWright 当我使用 VxWorks 5.1.1、5.4 和 5.5 版本时,有一种方法可以将 .o 加载到内存中并直接从命令行调用自定义 C 函数。我不知道这是否是操作系统自定义构建的产物(我们不得不修改 C 代码,只是为了给我们的系统添加一个硬盘驱动器……所以可能)或其他什么。
  • 你在关注this answer吗? (顺便说一句,你没有回应:有用吗?)如果有,我再看看
  • 我已经完全执行了上一步。问题是如何修改可执行文件以避免多个引用。包 Linker 中是否有任何属性可用于取消链接双重引用?我已经成功在链接器(gps 环境)中添加了 POS_api.o 并且得到了同样的错误。

标签: ada vxworks gprbuild


【解决方案1】:

恐怕这不是一个真正的答案:主要是因为我与 VxWorks 和 Ada 合作已经十多年了,事情变得有些模糊。另外,对您的问题发表评论有点长

当我使用它时,VxWorks 带有一整套软件,您可以配置这些软件将您需要的组件保存到内核中:在这种情况下,它可能包括数学包、sin() 等函数像taskSpawn()这样的操作系统功能。

我们使用的 Ada/VxWorks 构建过程会生成一个部分链接的目标文件,其中对 sin()taskSpawn() 的引用未解决(我不记得这是如何实现的;如果使用 GNU ld,也许-r--relocatable 开关?)。当 VxWorks 通过配置的内核加载这个目标文件时,未解析的引用得到解析,然后我们就走了。

现在,我不知道您的 POS_API 做了什么。它是配置的 VxWorks 内核的皮肤吗?它会加载您的 Ada 程序本身吗?如果它本身就是一个VxWorks程序,怎么会导出sin()

我怀疑问题与您链接可执行文件的方式有关。也许您可以向我们展示您的 GPR 文件?否则,我只是在黑暗中吹口哨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2013-08-30
    相关资源
    最近更新 更多