C++ 由c+执行的ADA文件存在问题+;VXWorks 6.7(workspace-4)中的(UsrAppInit)?
我在ADA(一个简单的Hello world)中正确编译了一个文件。我想用TaskSpAn从C++执行文件.O。要做到这点,我已经读到,你必须在C++中声明类似的东西: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 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
在哪里
:主程序不在Ada中-n
:-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++编译和链接,它需要艾达运行时在
$ 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!