linux — неопределенный символ: __gnat_rcheck_CE_Invalid_Data при связывании ADA с переполнением стека

Я связываю некоторые объектные файлы ADA с некоторым кодом C ++, который вызывает функции ADA. Компиляция и компоновка проходят без проблем, но когда я запускаю программу, возникает исключение времени выполнения:

undefined symbol: __gnat_rcheck_CE_Invalid_Data

Похоже, что я забыл связать некоторый объектный файл. Однако я передаю все файлы .o, сгенерированные компилятором ADA, компоновщику …

Есть идеи?

ура

Майкл

П.С .: Я работаю над (Ubuntu) Linux, GNAT 2014, gcc 4.7.4.

0

Решение

Вы инициализируете Ada RTS перед вызовом какой-либо функциональности Ada?

(при условии, что основная программа находится на C ++)

Если нет, см. этот простой пример о том, как совместить два.

По сути, ваша основная программа на C ++ должна вызывать adainit() как часть его инициализации, чтобы запустить систему времени выполнения Ada, перед вызовом любого кода Ada, он должен вызвать adafinal() перед выходом, чтобы Ada RTS могла корректно завершить работу (например, завершить объекты, освободить хранилище, завершить задачи и т. д.)

На практике мне проще написать основную версию на языке Ada, а также ссылки в файлах и библиотеках C / C ++ .o. Ada автоматически отслеживает свои собственные зависимости, поэтому вам нужно только явно сообщить gnatmake (или gprbuild) о частях C / C ++.

4

Другие решения

Я решил проблему. Причина была в том, что я не связывал библиотеку gnat-2014 при компиляции программы на C ++.

Для всех остальных новичков: Добавить -lgnat-2014 -L<directory_to_libgnat-2014.so> к опциям gcc.

В конце концов я последовал предложению Саймона Райта и скомпилировал мой код ADA в (общую) библиотеку, которая работает как шарм.

Спасибо всем за ваши предложения!

0