Я знаю, что подобные вопросы задают так много раз. Но я все еще на стадии планирования, поэтому надеюсь, что смогу получить правильное направление перед стартом.
Мое дело таково: мне нужно написать библиотеку общего назначения в C, которая должна использовать другую библиотеку C++. Все они написаны с C99 и стандартом posix.
Эта библиотека C в свою очередь будет вызываться любой программой (C, C++) и запускаться на многоуровневой платформе Unix, такой как AIX, HP-UX, Linux, Solaris.
Кто-то сказал мне, что это невозможно. Это правда?
Да, это возможно, соблюдая следующее:
1) Любые экспортируемые функции в библиотеке C++ должны быть отмечены extern "C"
.
2) Только пропускайте простые старые типы данных (POD) между библиотеками C и C++. Вы можете уйти со структурами, но убедитесь, что вы последовательно собираете элементы.
3) Никогда не выделяйте память в библиотеке C и не освобождайте ее в библиотеке C++ и наоборот. Выделение строк в частности может быть болью: нормальная вещь - передать буфер с размером, и функция возвращает количество данных, которые могли быть записаны в этот буфер.
4) Никогда не бросайте исключения через границы библиотеки. Используйте объект типа информации об ошибке в библиотеке C++, привязанный к каждому потоку (легко в C++ 11, поскольку у вас есть std::this_thread
и т.д.)
Вы хотите создать общий объект или так (dll для linux для моего понимания), к которому должны обращаться несколько клиентов, пока они используют разные операционные системы...
Как только клиенты (AIX, HP-UX, Linux, Solaris) будут взаимодействовать с библиотекой C через интерфейс C++ (мы будем называть его сервером?), Я не вижу проблемы, потому что это на самом деле ваш Интерфейс C++, который обращается к.so; Если они должны использовать непосредственно общий объект, я боюсь, вам придется его компилировать несколько раз, для каждой несовместимой ОС (или пусть они могут ее скомпилировать) и отправить им правильную версию, но я не думаю, что то, что вы хотите,
extern C
функциями-extern C
которые вызывают библиотеку C ++, особенно если библиотека C ++ не является открытым исходным кодом, и вы не можете ее изменить, а затем использовать эти обертки в вашей библиотеке C.