Можете ли вы вызывать функции C ++ из Ada?

StackOverflow https://stackoverflow.com/questions/611323

  •  03-07-2019
  •  | 
  •  

Вопрос

Можете ли вы вызывать функции C ++ из Ada?

Мне интересно, есть ли способ сделать это напрямую, без реализации на C и написания C ++-оболочки & и Ada-оболочки, напримерЯ бы хотел перейти на c ++ -> Ada, а не на c ++ -> c -> Ada.

Это было полезно?

Решение

Проблема с Ada для C ++ состоит в том, что C ++ НЕ имеет определенного ABI.
Каждому компилятору разрешается определять наиболее эффективный ABI, какой только может.

Таким образом, сопряжение с другими языками (Ada) является проблемой, так как вам нужно, чтобы ваш компилятор Ada знал, с каким компилятором был скомпилирован C ++, прежде чем он сможет сгенерировать правильный код для вызова любого метода / функции C ++.

С другой стороны, C ABI четко определен как стандарт для всех компиляторов и, как таковой, предоставляет удобный удобный интерфейс для любого языка, с которым можно соединиться.

Другие советы

Единственный действительно независимый от компилятора ответ, который я могу вам дать, заключается в том, что это так же возможно, как вызов C ++ из C в вашей системе.

Как и в случае с C, вы должны вычислить символ с искаженным именем вашей подпрограммы C ++ и написать привязку на стороне C (в данном случае Ada), которая ссылается на это искаженное имя.Вам также, вероятно, придется сделать некоторые вещи на стороне C ++, например, объявить функцию C ++ extern.

Если вы можете объявить свою функцию C ++ extern "C", это просто.Просто сделайте это на стороне C ++ и используйте стандартные функции импорта C Ada на стороне Ada.

Пример:

в вашем cpp:

extern "C" int cpp_func (int p1, int p2) {
   ; // Whatever..
}

в вашем .adb:

function cpp_func (p1, p2 : Interfaces.C.Int) return Interfaces.C.Int;
pragma Import (C, cpp_func); 

...
Result : constant Interfaces.C.Int := cpp_func (1, 2);

Вас может заинтересовать эта статья, в которой обсуждается привязка Ada к C ++ на уровне объектов:

http://www.adacore.com/uploads/technical-papers /Class_level_interfacing.pdf

Кроме того, в последней версии GNAT имеется мощный автоматический генератор привязок.

Это не представляется возможным ...

Информация здесь

" Прямой интерфейс к C ++ от Ada выходит за рамки Ada (по меньшей мере, 95) "

swig может сделать это

Я не прикасался к Аде с 99/00, поэтому моя память может быть немного неаккуратной, но когда мы работали над приложением с графическими окнами в Аде, нам нужно было кое-что сделать на C ++ (не критически важного) и то, как мы они должны были иметь материал c ++ в dll (s), а затем создать обертку C для этой DLL, а затем использовать прагматический интерфейс, который определял обертку c, и затем мы могли вызывать методы внутри dll из этого интерфейса. / р>

Я думаю, что это потребовало некоторой тройной поддержки, потому что сигнатуры методов должны были быть обновлены в интерфейсе pragma и оболочке C, если они изменились в dll c ++.

В основном это была боль. Я думаю, что мы должны были использовать директиву Win32 Lean и Mean precomplier в оболочке C.

В любом случае, это все, что мы трое, работавшие над проектом, могут запомнить.

Green Hills Software также опубликовала отличный PDF-файл об этом.
http://www.ghs.com/download/whitepapers/ada_c++.pdf

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top