C++ 由c+执行的ADA文件存在问题+;VXWorks 6.7(workspace-4)中的(UsrAppInit)?

C++ 由c+执行的ADA文件存在问题+;VXWorks 6.7(workspace-4)中的(UsrAppInit)?,c++,macros,ada,vxworks,C++,Macros,Ada,Vxworks,我在ADA(一个简单的Hello world)中正确编译了一个文件。我想用TaskSpAn从C++执行文件.O。要做到这点,我已经读到,你必须在C++中声明类似的东西: #包括 /*Ada binder生成的main-Ada_main作为宏从makefile传递*/ 外部无效ADA_MAIN(无效); void UsrAppInit() { int stackSize=0x80000; int spawnFlags=VX\u FP\u任务; /*MAIN_TASK_名称作为宏从makefile

我在ADA(一个简单的Hello world)中正确编译了一个文件。我想用TaskSpAn从C++执行文件.O。要做到这点,我已经读到,你必须在C++中声明类似的东西:

#包括
/*Ada binder生成的main-Ada_main作为宏从makefile传递*/
外部无效ADA_MAIN(无效);
void UsrAppInit()
{
int stackSize=0x80000;
int spawnFlags=VX\u FP\u任务;
/*MAIN_TASK_名称作为宏从makefile传递*/
char*mainTaskName=(char*)MAIN_TASK_NAME;
int优先级=100;
/*生成Ada环境任务*/
taskSpawn(mainTaskName、优先级、spawnFlags、堆栈大小、,
(职能)阿达奥梅因,1、2、3、4、5、6、7、8、9、10);
}
为了完成这个过程,我在makefile中将ADA_MAIN声明为一个宏(在我的例子中,makefile是makefile.mk)

(主任务名为“helloworld的过程”)


但是宏在这个过程中无法识别,所以我在编译MAIN_TASK_NAME和ADA_MAIN时出错。有没有关于我怎么会错过的建议?我也可以用不同的方式做,但如何做?

我不知道你的
ADA_MAIN
,你也不告诉我们你的
宏是什么,所以谈论它们有点困难。还有,我已经有一段时间没有使用VxWorks了(那时,我们得到了支持,因此可以访问为我们构建的交叉编译器:我们的主程序是用Ada编写的)

也就是说,你的问题归结为

Ada程序需要细化。这是一个调用运行时库的所有组件并按正确顺序对它们进行初始化的过程。你问什么成分?例如,有一个明显的
Ada.Text_IO
;还有一些不太明显的事情,比如异常处理

精化代码是使用gnatbind生成的

鉴于此,
hello.adb

with Ada.Text_IO;
procedure Hello is
begin
   Ada.Text_IO.Put_Line ("hello!");
end Hello;
您确实需要提供一个规范,否则编译器将生成一个链接器名称,例如
\uu ada\u 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
    :主程序不在Ada中
  • -Lhello
    adainit
    adafinal
    重命名
    helloinit
    helloinit
  • -静态
    :很确定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++编译和链接,它需要艾达运行时在 LBGNAT.A < /COD>和(为任务)<代码> LBGNARL。一个,当然是非常编译器和安装特定的:这里,在MaOS主机上,我使用了

$ 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
传递给
tasksawn()
代替您的
ADA_MAIN

您还没有编写您正在使用的ADA编译器,但是假设它是GNAT,C/C++应用程序必须在调用ADA子程序之前首先调用adainit,C/C++应用程序的最后一个操作是调用adafinal。也许这些调用隐藏在上面提到的ADA_MAIN宏中?如果你的编译器是GNAT,我将尝试回答。如果没有,请访问编译器手册/供应商。如果您认为宏有问题(为什么使用它?),您应该将其添加到您的问题中。很抱歉延迟,Ada编译器是GNAT PRO 18.2。宏是根据我在网上看到的示例大写的。adainit()和ADAFILAL在构建过程中不被识别。
$ 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!