Вызов функции в общей библиотеке с указанием ее имени и подписи - PullRequest
3 голосов
/ 13 июня 2011

У меня есть небольшой DSL, который должен загружать разделяемые библиотеки и запускать функции, которые они экспортируют. Наконец, решенная проблема: dlopen, dlsym, LoadLibrary и GetProcAddress - все, что вам нужно для кросс-платформенного использования динамических библиотек. Это просто!

C ++ не согласен.

Благодаря dlsym и т. Д. У меня есть все, что мне нужно: указатель на функцию из библиотеки, представление сигнатуры из исходного файла и ... нет возможности вызвать одну из них, используя другую.

Я просто хочу подтвердить свое мнение о том, что никакие хитрости с varargs, variadic шаблонами или другим волшебством не помогут, если вся информация о типах, которую я имею, является динамической. Я подойду к одному из следующих решений, а также хотел бы получить мнения, которые предпочтительнее (я склоняюсь к последнему).

  • Ограничить подпись принятием и возвратом маршализованного указателя объекта и написать оболочку для каждой библиотеки, с которой будет использоваться язык.

  • Скомпилируйте DSL на C-совместимый язык (читай: C ++), чтобы необходимая информация была доступна во время компиляции (читай: вторая компиляция).

1 Ответ

3 голосов
/ 13 июня 2011

Используйте libffi для вызова функции. Если у вас есть указатель на функцию, и вы знаете ее аргументы и возвращаемые типы, то вы - золотой. Ffi знает, как обращаться с ABI для конкретной платформы, создавать кадр стека, выдвигать аргументы и возвращать возвращаемое значение и т. Д.

C ++ name-mangling делает это немного сложнее, но если вам уже удалось получить указатель на функцию, похоже, что эта часть уже решена ...

...