微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Ada可执行文件中,编译指示导出功能不是外部的

如何解决在Ada可执行文件中,编译指示导出功能不是外部的

我需要一个Visual Studio C ++ DLL才能在我的Ada主线中调用一个函数。 Ada代码具有类似

功能规范
package offset is
    function GET_OFFSET return integer;
    pragma Export (Stdcall,GET_OFFSET,"fnAdaOffset");
end offset;

然后,C ++函数将按如下所示调用Ada方法

typedef int (*tdAdaOffset)(void);
tdAdaOffset _ptAdaOffset = NULL;

int AdaOffset()
{
   if (_ptAdaOffset == NULL)
   {
      _ptAdaOffset = (tdAdaOffset)GetProcAddress(GetModuleHandle(NULL),"fnAdaOffset@0");
      if (_ptAdaOffset == NULL)
         throw "Function not found";
   }
   return (*_ptAdaOffset)();
}

我相信这会起作用。我的问题是Ada拒绝将GET_OFFset函数标记为可执行文件中的外部函数,即执行dumpbin / exports ada.exe显示没有导出函数

我已经阅读了--version-script for the linker之类的各种解决方案,但是我的链接器似乎太老了,无法了解此开关。

一个有希望的选择是将-shared添加链接步骤,但是虽然现在公开了这些功能,但它还将输出文件更改为DLL(扩展名为.EXE(!)),因此也没有用。

升级工具链之前,是否可以尝试其他链接器开关或其他建议?

解决方法

您需要告诉链接器从可执行文件中导出符号。 ld有一个选项--export-dynamic,但是选项only works on ELF targets

请注意,此选项特定于ELF目标端口。 PE目标支持类似的功能,可以从DLL或EXE导出所有符号;请参阅下面的--export-all-symbols的说明。

因此,在Windows上,您需要使用--export-all-symbols

取决于您如何编译Ada代码,您可能需要通过编译器命令(gcc)传递此选项。要告诉gcc链接器将使用一个选项,请在其前面加上-Wl,然后给链接器选项加逗号分隔。在这种情况下,您将以-Wl,--export-all-symbols结尾。

如果您使用的是GPRBuild,则.gpr文件的相关部分应如下所示:

package Linker is
  for Default_Switches ("Ada") use ("-Wl,--export-all-symbols");
end Linker;

旁注:

  • 请注意,C ++的int不一定与Ada的Integer相同,而应该在Ada中使用Interfaces.C.int作为返回类型。
  • 呼叫约定必须匹配。 Ada中的Stdcall与C ++中的显式__stdcall相匹配。如果C ++代码中没有__stdcall,请改用Ada中的C调用约定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。