python - 防止 Ada DLL 中的名称错位

标签 python dll ada name-mangling

有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏?

这是我的 .adb 代码

with Ada.Text_IO;
package body testDLL is
   procedure Print_Call is
   begin
      Ada.Text_IO.Put_Line("Hello World");
   end Print_Call;

   function Add_Nums(A,B : in Integer) return Integer is
   begin
      return A + B;
   end Add_Nums;

end testDLL;

我的.ads

package testDLL is
   procedure Print_Call;
   pragma export (dll, Print_Call, "Print_Call");

   function Add_Nums(A,B : in Integer) return Integer;
   pragma export (dll, Add_Nums, "Add_Nums");
end testDLL;

我的 python

import ctypes

TestDLL = ctypes.WinDLL ("libTestDLL.dll")
Print_Call = getattr(TestDLL, "Print_Call@0")
Print_Call()

您可以看到我必须在函数名称的末尾添加“@0”,但是当我将相同的代码移至不同的编译器时,这似乎有所改变。这给我带来了一些问题。我需要一种标准的修改格式或一种将修改全部删除的方法。

最佳答案

可以通过pragma的Link_Name和External_Name参数来控制对象名,这样写:

pragma Export (C, Print_Call, "Print_Call", "Print_Call");

或者,如果您使用的是 Ada2012,则可以使用方面来指定这些:

function Add_Nums(A,B : in Integer) return Integer
    with Export, Convention => Ada, Link_Name => "Add_Nums";

以下内容涵盖了 Ada 的接口(interface)编译指示: http://www.ada-auth.org/standards/12rm/html/RM-J-15-5.html

这个话题包含了一些揭示两者差异的讨论: https://groups.google.com/forum/?fromgroups=#!searchin/comp.lang.ada/opengl/comp.lang.ada/6IVlMbtvrrU/mv3UUiDg5RwJ

关于python - 防止 Ada DLL 中的名称错位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271818/

相关文章:

python - 如何在 Python 数据框中查找不共享公共(public)日期(或索引)的行

python - 如何运行python文件中的所有方法,并返回是否有任何方法返回true?

c++ - 我应该/可以/必须如何处理我的 C++ 项目所依赖的 dll?

ada - SPARK 中的程序验证 - 计算数组中的元素

python - 用 Numpy 矩阵乘法数组

python - Pandas:无法安全地将传递的用户数据类型 int32 转换为 float64

c# - 委托(delegate)从引用的 C++ DLL 触发 C# 函数

c# - 无法引用 Microsoft.SharePoint.Client.dll

ada - 在 Ada 中将空枚举传递给泛型的惯用方法

types - 是否可以认为 Ada 子类型等同于依赖类型?