Смешивание библиотек c и c ++ (мульти-Unix платформа)

0

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

Мое дело таково: мне нужно написать библиотеку общего назначения в C, которая должна использовать другую библиотеку C++. Все они написаны с C99 и стандартом posix.

Эта библиотека C в свою очередь будет вызываться любой программой (C, C++) и запускаться на многоуровневой платформе Unix, такой как AIX, HP-UX, Linux, Solaris.

Кто-то сказал мне, что это невозможно. Это правда?

  • 1
    в библиотеке c ++ должны быть функции "extern C", иначе вы не сможете их вызвать
  • 0
    В качестве альтернативы, если таких интерфейсов не существует, вам придется написать некоторый код C ++ с extern C функциями- extern C которые вызывают библиотеку C ++, особенно если библиотека C ++ не является открытым исходным кодом, и вы не можете ее изменить, а затем использовать эти обертки в вашей библиотеке C.
Теги:
solaris

2 ответа

5
Лучший ответ

Да, это возможно, соблюдая следующее:

1) Любые экспортируемые функции в библиотеке C++ должны быть отмечены extern "C".

2) Только пропускайте простые старые типы данных (POD) между библиотеками C и C++. Вы можете уйти со структурами, но убедитесь, что вы последовательно собираете элементы.

3) Никогда не выделяйте память в библиотеке C и не освобождайте ее в библиотеке C++ и наоборот. Выделение строк в частности может быть болью: нормальная вещь - передать буфер с размером, и функция возвращает количество данных, которые могли быть записаны в этот буфер.

4) Никогда не бросайте исключения через границы библиотеки. Используйте объект типа информации об ошибке в библиотеке C++, привязанный к каждому потоку (легко в C++ 11, поскольку у вас есть std::this_thread и т.д.)

1

Вы хотите создать общий объект или так (dll для linux для моего понимания), к которому должны обращаться несколько клиентов, пока они используют разные операционные системы...

Как только клиенты (AIX, HP-UX, Linux, Solaris) будут взаимодействовать с библиотекой C через интерфейс C++ (мы будем называть его сервером?), Я не вижу проблемы, потому что это на самом деле ваш Интерфейс C++, который обращается к.so; Если они должны использовать непосредственно общий объект, я боюсь, вам придется его компилировать несколько раз, для каждой несовместимой ОС (или пусть они могут ее скомпилировать) и отправить им правильную версию, но я не думаю, что то, что вы хотите,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню