我有一个文件构建和ADA正确编译(一个简单的Hello World)。 我想从C ++使用taskspawn执行该文件的.o。 要做到这一点我已阅读,你必须在C ++声明类似的东西:
...
#include <taskLib.h>
/* Ada binder-generated main - ADA_MAIN is passed as a macro from the makefile */
extern void ADA_MAIN(void);
void UsrAppInit()
{
int stackSize = 0x80000;
int spawnFlags = VX_FP_TASK;
/* MAIN_TASK_NAME is passed as a macro from the makefile */
char * mainTaskName = (char *) MAIN_TASK_NAME;
int priority = 100;
/* Spawn Ada environment task */
taskSpawn(mainTaskName, priority, spawnFlags, stackSize,
(FUNCPTR) ADA_MAIN, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
完成我已经宣布ADA_MAIN在生成文件宏的过程(在我的Makefile是makefile.mk)
(MAIN_ADA pathOfmyADAexe和MAIN_TASK_NAME “了HelloWorld的过程”)
但宏没有在这个过程中认识到,所以我在编译的MAIN_TASK_NAME和ADA_MAIN有错误。 有关如何我缺少什么建议吗? 我还可以做不同的方式,但如何?
我不知道你的ADA_MAIN
,你不告诉我们你是什么MACRO
是,所以这是一个有点难以谈论它们。 此外,这是一段时间,因为我的VxWorks(和,那么,我们是支持的,所以不得不进入一个交叉编译器做的建立我们:我们的主要程序是ADA)。
这就是说,你的问题归结为建立一个程序,阿达成分,其中主要的项目是不是在阿达 。
阿达程序需要阐述 。 这是在运行时库的所有组件调用并安排他们以正确的顺序进行初始化的过程。 哪些组件,你问? 还有,例如,有明显的Ada.Text_IO
; 而且也将不那么明显的东西,比如异常处理。
制订代码是使用gnatbind生成。
鉴于这种hello.adb
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("hello!");
end Hello;
你真的需要提供一个规范,否则编译器将生成一个连接器的名称,如__ada_hello
; 通过采取控制hello.ads
,
procedure Hello with
Export,
Convention => C,
External_Name => "hello";
你会使用一个交叉编译套件。 该组件由目标名称,如前缀powerpc-wrs-vxworks-gnatmake
, arm-eabi-gnatbind
,但我就用下面的裸组件名称。
$ gnatmake -c hello.adb
其产生hello.o
, hello.ali
(如果程序是更复杂的,它会编译闭合太)。
现在绑定:
$ gnatbind -n -Lhello -static hello.ali
哪里
-
-n
:主程序不是在阿达 -
-Lhello
: adainit
, adafinal
改名helloinit
, hellofinal
-
-static
:可以肯定的VxWorks并不支持共享库?
生成b~hello.ads
, b~hello.adb
(取决于编译器释放,则~
可以由例如双下划线取代)。 编译:
$ gnatmake -c b~hello.adb
现在,从C ++调用。 你需要告诉在Ada代码符号编译器中,如hello.h
:
extern "C" {
void helloinit();
void hellofinal();
void hello();
}
然后主程序在main.cc
:
#include "hello.h"
int main() {
helloinit();
hello();
hellofinal();
}
这让你用C ++编译和链接,需要阿达运行时libgnat.a
和(对于任务) libgnarl.a
,并且当然是非常反编译和安装特定的:在这里,MacOS的主机上,我用
$ g++ main.cc b~hello.o hello.o /opt/gcc-8.1.0/lib/gcc/x86_64-apple-darwin15/8.1.0/adalib/libgnat.a
$ ./a.out
hello!
翻译这VxWorks的情况下,我会说,你会打电话helloinit()
从主程序(你可能不会需要hellofinal()
并通过hello
来taskSpawn()
来代替你的ADA_MAIN
。
文章来源: Problem with ADA file executed by a c++(UsrAppInit) in VXWorks 6.7(workspace-4)?