我有一个文件生成文件,并且已在ADA(一个简单的Hello world)中正确编译。我想使用taskpawn从C ++执行文件.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);
}
为完成该过程,我在makefile中将ADA_MAIN声明为MACRO(在我的情况下,makefile为makefile.mk)
((MAIN_ADA pathOfmyADAexe和MAIN_TASK_NAME“ helloworld的过程”)
但是在此过程中无法识别MACRO,因此在编译MAIN_TASK_NAME和ADA_MAIN时出现错误。关于我怎么想念的任何建议?我也可以用其他方式来做,但是怎么做?
答案 0 :(得分:1)
我不知道您的ADA_MAIN
,而且您也不会告诉我们您的MACRO
是什么,因此很难谈论它们。另外,自从我使用VxWorks以来已有一段时间了(然后,我们得到了支持,因此可以访问为我们进行构建的交叉编译器:并且我们的主程序在Ada中)。
也就是说,您的问题归结于building a program with Ada components where the main program isn't in Ada。
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
:主程序不在Ada中-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
中的Ada运行时,并且当然是特定于编译器和安装的:我使用过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
。