如何解决在Ada可执行文件中,编译指示导出功能不是外部的
我需要一个Visual Studio C ++ DLL才能在我的Ada主线中调用一个函数。 Ada代码具有类似
的功能规范package offset is
function GET_OFFSET return integer;
pragma Export (Stdcall,GET_OFFSET,"fnAdaOffset");
end offset;
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 举报,一经查实,本站将立刻删除。