【问题标题】:Calling Ada from C++ in Eclipse在 Eclipse 中从 C++ 调用 Ada
【发布时间】:2012-04-28 03:10:12
【问题描述】:

我正在尝试创建一个完全托管在 Eclipse 中、以 C++ 启动并调用 Ada 的程序。我已经加载了 GNATBench,并且可以毫无问题地运行 Ada 程序。我不能做的是让 C++ 项目称为 Ada 项目。

在四处寻找之后,我找到并使用 make 文件执行了下面显示的代码。

http://www.pegasoft.ca/resources/boblap/book.html

我还发现一个帖子说我的目标已经完成。

http://blogs.windriver.com/parkinson/2009/10/yesterday-adacore-announced-the-release-of-gnatbench-231-its-ada-integrated-development-environment-eclipse-plugin-which.html

为了让 C++ 在 Eclipse 中调用 Ada 在 Eclipse 中,我还需要包括什么?


使用制作文件:

$ c++ -c test.cc
$ gnatgcc -c test_subr
$ gnatbind -n test_subr
$ gnatgcc -c b~test_subr
$ gnatlink -o main test.o test_subr.ali --link=c++
$ ./main

CPP代码:

//main.cc

#include extern "C" void adainit(void);    
#include extern "C" void adafinal(void);
#include extern "C" void ada_subroutine(void);

int main(int argc, char **argv)
{
   puts("C++ main");
   adainit();

   ada_subroutine();

   adafinal();
   puts("C++ done");

   return 0;
}

Ada 代码:

package Test_Subr is
    procedure Ada_Subroutine;
    pragma export(CPP, Ada_Subroutine);
end Test_Subr;

with Ada.Text_IO;
use Ada.Text_IO;

package body Test_Subr is

    procedure Ada_Subroutine is
    begin
        put("IN ADA");
    end Ada_Subroutine;

end Test_Subr;

【问题讨论】:

    标签: c++ eclipse eclipse-plugin eclipse-cdt ada


    【解决方案1】:

    您是否尝试过使用 Export pragma 的 External_Name 参数? (IIRC,C++ 链接可能会被严重破坏。)

    pragma Export
    ( Convention    => CPP,
      Entity        => Ada_Subroutine,
      External_Name => "Ada_Subroutine "
    );
    

    【讨论】:

    • 您能否提供有关如何设置 IDE 首选项的更多信息?我可以编译 Ada,但 C++ 错误(说找不到 adainit、ada_subroutine 和 adafinal)。这是我需要对代码进行的唯一修改吗?
    • 可能;您会看到 pragma 的 External_Name 参数覆盖了在创建的目标文件中给它的默认“标签”;当链接器获取由 C++ 生成的目标文件时,它需要指定的名称与另一个目标文件中的名称匹配。如果不是,我注意到 #import extern 说 C;虽然 Ada 出口显示 CPP,但您可以尝试将它们都设为 C。
    【解决方案2】:

    我不知道 Eclipse;但是,如何在 Eclipse 中让一个 C++ 项目调用另一个 C++ 项目?还是用 C 写的?

    您也许可以让 Eclipse 访问 build the Ada as a library 并从 C++ 调用它?

    【讨论】:

      【解决方案3】:

      在一般情况下,您需要在 C++ 端使用 extern C 并在 Ada 端使用 pragma exprort (C, .. 以使两个链接(参数传递方案)相同。但是,如果您对 Ada 和 C++ 都使用 gcc,那么您可以改用 pragma export (CPP

      还有一个你必须注意的细节。如果你的“main”(程序的入口点)is not written in Ada,那么你需要在调用任何东西之前手动调用一次 Ada 的精化过程(通过例程adainit())。同样,在大多数情况下,您应该在退出程序之前调用adafinal()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多