为什么Ada主文件中的非显而易见的“with”语句会导致链接失败?

时间:2017-11-29 16:25:19

标签: ada

所以,这是一个废话,但我有一个.gpr文件作为遗留代码包的一部分。在构建期间链接了大量的C和C ++代码。

本身,包装工作得很好。但是,如果我将Main文件从当前主文件更改为另一个主文件 - 其中偶然有一个明显不必要的with语句,项目构建将失败并显示以下消息:

错误消息:

  

gprbuild:test_main.2.ada的链接失败

除了Main过程本身中的不同代码(代码不是问题的一部分),两个文件之间的唯一区别是删除了这个单with指令。如果它在那里,构建成功。如果我将其注释掉,则构建失败。请注意,编译器没有注意到问题,因为Main中的代码似乎都不需要它。

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

在你的问题中继续下去,但是pragma Linker_Options ed包中有一种可能性是with,如果另一个包也依赖于某些链接器选项,但是没有指定pragma本身。在这种情况下,您可以

  • 将pragma复制到其他包,或
  • 修改gpr文件中Default_Switches中的package Linker以包含选项

答案 1 :(得分:2)

在你的主程序中有一个*ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"* 没有明显需要的原因之一就是你有一个库级组件,可能涉及一个任务(由with暗示),这在逻辑上处于您设计的顶层,因此不会被其他任何东西自然引用。

这样的库级组件可能看起来像(警告,Ada2012这里)

pragma Priority (System.Priority'Last);

然后

package Top with Elaborate_Body is
end Top;

with ...;
with System;
package body Top is

   task Processing with Priority => System.Priority'Last;

   task body Processing is
   ...

end Top;

with Top; pragma Unreferenced (Top); procedure Main is ... 将停止GNAT警告您pragma Unreferenced未被使用。)

但是,这会导致链接失败并不明显。也许(相当于)Top,或只有它引用的东西,有Top调用系统其他部分所需的库?