如何在Ada程序中调用Ada-dll函数?

如何在Ada程序中调用Ada-dll函数?,dll,ada,gnat,Dll,Ada,Gnat,我创建了一个ADADDLL,其中包含一个函数,该函数返回给定给它的两个整数之和。 我正在尝试实现一个Ada程序,它加载Ada DLL,用两个数字调用函数,然后在控制台上打印结果 with Addition; use Addition; with Ada.Text_IO; use Ada.Text_IO; procedure loader is pragma Linker_Options ("Addition.dll"); --ada dll begin Adder(4,3); Put

我创建了一个ADADDLL,其中包含一个函数,该函数返回给定给它的两个整数之和。 我正在尝试实现一个Ada程序,它加载Ada DLL,用两个数字调用函数,然后在控制台上打印结果

with Addition;
use Addition;
with Ada.Text_IO;
use Ada.Text_IO;


procedure loader is

pragma Linker_Options ("Addition.dll"); --ada dll 

begin

Adder(4,3);
Put_Line("Adder");

end loader;
Giving me error=>无法在过程调用中使用函数

有人能告诉我如何在另一个Ada程序中调用Ada dll函数吗

谢谢。

with Ada.Text\u IO;
加上;
程序加载器是
使用Ada.Text\u IO;
使用加法;
I:整数;
开始
I:=加法器(4,3);
Put(整数图像(I));
端部装载机;

您是否使用GNAT编译和链接代码?本质上,您必须为正在调用的库传递必要的参数(您使用了术语“DLL”,大概意味着您在Microsoft Windows环境中)。我不能直接对Windows发表评论,但在Linux中,您可以传递-l。您可以通过-largs参数来实现这一点,例如,我正在编译一个使用wiringpic库(在一个树莓Pi上)的应用程序,我传递的是“-largs-lwiringPi”。我有一个单独的包,它提供了到该库的接口。我猜你的“添加”包就是这么做的,如果不是,我们需要看看它是什么

使用库的另一种技术是使用GNAT提供的工具。例如,如果“Addition”是GNAT工具库的一部分,那么您可以使用该方法。在本例中,您有一个单独的项目文件(或者更确切地说,Gnat有),您可以在项目文件中引用它。我想您正在使用项目文件?这里有一个很好的参考: 这还显示了如何创建自己的工具集

对于我的一个项目(当我完全解决了所有bug后,我会在GitHub上弹出它),我有一个Makefile,看起来像:

#########################################################
#             Make file for Light Switches              #
#########################################################

# Use standard variables to define compile and link flags
ACC=gprbuild
TA=light_switches
TS=$(TA).gpr
HOST_TYPE := $(shell uname -m)
ifeq ($(HOST_TYPE),amd)
    TARGET=sparc
else ifeq ($(HOST_TYPE),x86_64)
    TARGET=amd64
else ifeq ($(HOST_TYPE),x86)
    TARGET=x86
else ifeq ($(HOST_TYPE),i686)
    TARGET=x86
else ifeq ($(HOST_TYPE),arm)
    TARGET=pi
else ifeq ($(HOST_TYPE),armv7l)
    TARGET=pi
endif
BIN=/usr/local/bin
ETC=/usr/local/etc
VAR=/var/local
TD=obj_$(TARGET)
ifeq ("$1.",".")
    FLAGS=-Xhware=$(TARGET)
else
    FLAGS=-Xhware=$(TARGET) $1
endif
ifeq ($(TARGET),pi)
    FLAGS+=-largs -lwiringPi
endif

lightswitches:
    $(ACC) -P $(TS) $(FLAGS)

# Define the target "all"
all:
    lightswitches:

# Clean up to force the next compilation to be everything
clean:
    gprclean -P $(TS)

dist-clean: distclean

distclean: clean

install:
    cp $(TD)/$(TA) $(BIN)
    cp $(TD)/$(TA).xml $(VAR)
    cp $(TD)/$(TA).xsd $(ETC)
    cp $(TD)/$(TA).rc $(ETC)/init.d/$(TA)
    cp $(TD)/$(TA).default $(ETC)/default/$(TA)
with "xmlada";
with "adasockets";
with "../tools/dstrings";
project Light_Switches is

   type Hware_Option is ("sparc", "amd64", "x86", "pi");
   Hware : Hware_Option := external ("hware", "amd64");

   for Languages use ("ada");
   case Hware is
   when "pi" =>
      for Source_Dirs use ("src/", "src/pi/", "../tools/");
   when others =>
      for Source_Dirs use ("src/", "src/non_pi/", "../tools/");
   end case;
   for Main use ("light_switches.adb");
   --  Using "hware" variable for obj directory
   for Object_Dir use "obj_" & hware & "/";

   package Ide is
      for Documentation_Dir use "doc/";
   end Ide;

   for Source_Files use ("error_log.adb",
      "error_log.ads", "general_storage_pool.adb", "general_storage_pool.ads",
      "switch_types.ads", "switch_database.ads", "switch_database.adb", 
      "lights_control.ads", "lights_control.adb", "light_switch_version.ads", 
      "light_switch_functions.ads", "light_switch_functions.adb", 
      "basic_lights_interface.ads", "basic_lights_interface.adb", 
      "host_functions.ads", "host_functions.adb", "host_functions_thin.ads", 
      "generic_command_parameters.ads", "generic_command_parameters.adb", 
      "interlocks.ads", "interlocks.adb",
      "calendar_extensions.adb", "calendar_extensions.ads", 
      "dynamic_lists.adb", "dynamic_lists.ads", 
      "string_conversions.ads", "string_conversions.adb",
      "wiring_pi.ads", "wiring_pi.adb",
      "generic_versions.ads", "generic_versions.adb", "light_switches.adb");

end Light_Switches;
然后我有一个项目文件,看起来像:

#########################################################
#             Make file for Light Switches              #
#########################################################

# Use standard variables to define compile and link flags
ACC=gprbuild
TA=light_switches
TS=$(TA).gpr
HOST_TYPE := $(shell uname -m)
ifeq ($(HOST_TYPE),amd)
    TARGET=sparc
else ifeq ($(HOST_TYPE),x86_64)
    TARGET=amd64
else ifeq ($(HOST_TYPE),x86)
    TARGET=x86
else ifeq ($(HOST_TYPE),i686)
    TARGET=x86
else ifeq ($(HOST_TYPE),arm)
    TARGET=pi
else ifeq ($(HOST_TYPE),armv7l)
    TARGET=pi
endif
BIN=/usr/local/bin
ETC=/usr/local/etc
VAR=/var/local
TD=obj_$(TARGET)
ifeq ("$1.",".")
    FLAGS=-Xhware=$(TARGET)
else
    FLAGS=-Xhware=$(TARGET) $1
endif
ifeq ($(TARGET),pi)
    FLAGS+=-largs -lwiringPi
endif

lightswitches:
    $(ACC) -P $(TS) $(FLAGS)

# Define the target "all"
all:
    lightswitches:

# Clean up to force the next compilation to be everything
clean:
    gprclean -P $(TS)

dist-clean: distclean

distclean: clean

install:
    cp $(TD)/$(TA) $(BIN)
    cp $(TD)/$(TA).xml $(VAR)
    cp $(TD)/$(TA).xsd $(ETC)
    cp $(TD)/$(TA).rc $(ETC)/init.d/$(TA)
    cp $(TD)/$(TA).default $(ETC)/default/$(TA)
with "xmlada";
with "adasockets";
with "../tools/dstrings";
project Light_Switches is

   type Hware_Option is ("sparc", "amd64", "x86", "pi");
   Hware : Hware_Option := external ("hware", "amd64");

   for Languages use ("ada");
   case Hware is
   when "pi" =>
      for Source_Dirs use ("src/", "src/pi/", "../tools/");
   when others =>
      for Source_Dirs use ("src/", "src/non_pi/", "../tools/");
   end case;
   for Main use ("light_switches.adb");
   --  Using "hware" variable for obj directory
   for Object_Dir use "obj_" & hware & "/";

   package Ide is
      for Documentation_Dir use "doc/";
   end Ide;

   for Source_Files use ("error_log.adb",
      "error_log.ads", "general_storage_pool.adb", "general_storage_pool.ads",
      "switch_types.ads", "switch_database.ads", "switch_database.adb", 
      "lights_control.ads", "lights_control.adb", "light_switch_version.ads", 
      "light_switch_functions.ads", "light_switch_functions.adb", 
      "basic_lights_interface.ads", "basic_lights_interface.adb", 
      "host_functions.ads", "host_functions.adb", "host_functions_thin.ads", 
      "generic_command_parameters.ads", "generic_command_parameters.adb", 
      "interlocks.ads", "interlocks.adb",
      "calendar_extensions.adb", "calendar_extensions.ads", 
      "dynamic_lists.adb", "dynamic_lists.ads", 
      "string_conversions.ads", "string_conversions.adb",
      "wiring_pi.ads", "wiring_pi.adb",
      "generic_versions.ads", "generic_versions.adb", "light_switches.adb");

end Light_Switches;
此项目使用的项目位于with语句的顶部。您可能会注意到其中一个是我的(在我的“工具”目录中)。此外,在上面,wiring_pi.adb有两种格式,一种在“pi”目录中,另一种在“non_pi”目录中。non_pi目录中的一个是存根(用于在非pi硬件上测试),pi目录中的一个有wiringPi C库文件中存在的例程列表(在unix世界中是一个.so文件,相当于一个DLL)


我希望这有帮助。如果没有,我们很乐意在获得有关您项目中的全套文件的更多信息后提供帮助。

此错误消息意味着您使用调用过程作为返回值的函数。只有函数可以返回值,而不是过程。可能您使用的函数没有返回一个位置?如果“加法器”是函数,那么您需要将其返回值赋给一个变量。@TimurSamkharadze您能指导我如何调用Ada Dll函数吗?我是Ada编程新手,这就是为什么我不能理解它的原因。这里的错误与调用Dll函数无关。“加法器”是功能还是程序?若加法器是一个函数,那个么将其返回值赋给某个函数。我在第一条评论中犯了一个错误-不是作为函数的过程,而是作为过程的函数error@arjitaverma我很乐意帮忙。但请记住,我们回答问题不仅仅是为了帮助你们,也同样是为了帮助遇到类似问题的其他人。-既然您找到了答案,请将其作为答案发布。在这里回答您自己的问题并没有错。感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。如果您可以添加程序包添加的源代码、项目文件和构建命令,那就太好了。