所以,这是一个废话,但我有一个.gpr
文件作为遗留代码包的一部分。在构建期间链接了大量的C和C ++代码。
本身,包装工作得很好。但是,如果我将Main
文件从当前主文件更改为另一个主文件 - 其中偶然有一个明显不必要的with
语句,项目构建将失败并显示以下消息:
错误消息:
gprbuild:test_main.2.ada的链接失败
除了Main
过程本身中的不同代码(代码不是问题的一部分),两个文件之间的唯一区别是删除了这个单with
指令。如果它在那里,构建成功。如果我将其注释掉,则构建失败。请注意,编译器没有注意到问题,因为Main中的代码似乎都不需要它。
知道为什么会这样吗?
答案 0 :(得分:2)
在你的问题中继续下去,但是pragma Linker_Options
ed包中有一种可能性是with
,如果另一个包也依赖于某些链接器选项,但是没有指定pragma本身。在这种情况下,您可以
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
调用系统其他部分所需的库?