我有一个文件构建,并在ADA (一个简单的Hello world)中正确编译。我想使用任务生成器从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 (在我的例子中,makefile是makefile.mk)中将ADA_MAIN声明为宏。
(MAIN_ADA pathOfmyADAexe和MAIN_TASK_NAME“helloworld的过程”)
但是宏在这个过程中不被识别,所以我在编译MAIN_TASK_NAME和ADA_MAIN时出错。有什么建议关于我是怎么失踪的吗?我也可以用不同的方式来做,但是怎么做呢?
发布于 2018-11-16 17:05:37
我不知道你的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,main程序非常确定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运行时,并且当然是特定于编译器和安装的:
$ 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。
https://stackoverflow.com/questions/53276028
复制相似问题