Calling Ada from C++ in Eclipse

浪尽此生 提交于 2019-12-12 21:59:39

问题


I am trying to create a program that is completely hosted in Eclipse, starts in C++, and calls Ada. I have GNATBench loaded, and can run Ada programs without a problem. What I cannot do is have a C++ project call an Ada project.

After hunting around, I found and executed the code shown below using a make file.

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

I also found a post stating that my goal has been done.

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

What else do I need to include to have C++ in Eclipse call Ada in Eclipse?


USING MAKE FILE:

$ 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 Code:

//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 Code:

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;

回答1:


Have you tried using the External_Name parameter of the Export pragma? (IIRC, C++ linkages can get quite mangled.)

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



回答2:


I don’t know Eclipse; but, how would you get a C++ project in Eclipse to call up another C++ project? or one written in C?

You might be able to get Eclipse to build the Ada as a library and invoke that from the C++?




回答3:


In the general case, you need to use extern C on the C++ side and pragma exprort (C, .. on the Ada side to get both linkages (parameter passing schemes) the same. However, if you are using gcc for both Ada and C++ then you could use pragma export (CPP instead.

There is one more nit you have to be aware of. If your "main" (the program's entry point) is not written in Ada, then you will need to manually invoke Ada's elaboration process (via the routine adainit()) once before calling anything. Likewise you should in most cases call adafinal() before exiting your program.



来源:https://stackoverflow.com/questions/10180040/calling-ada-from-c-in-eclipse

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!