Я не знаю о вашем ADA_MAIN
, и вы не говорите нам, каков ваш MACRO
, поэтому о них немного сложно говорить. Кроме того, прошло некоторое время с тех пор, как я использовал 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;
вам действительно нужно указать спецификацию, иначе компилятор сгенерирует имя компоновщика, например __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 ++, который требует времени выполнения Ada в 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
.