Как сделать двоичную совместимую динамическую библиотеку на Windows с C ++? - PullRequest
0 голосов
/ 01 февраля 2019

Я делаю графический движок C ++ и хочу распространять его в dll.Как я могу сделать DLL совместимым с другими компиляторами?Я читал о COM, но этот метод мне не подходит, потому что я не хочу зависеть от заголовков Windows.Второй способ, который я знаю - сделать старый интерфейс C, но я планирую API в объектно-ориентированном стиле, поэтому этот метод также нереален.Есть ли другие способы сделать это в C ++ на Windows?

1 Ответ

0 голосов
/ 01 февраля 2019

Я знаю, почему вы хотите избежать COM.Согласен.Таким образом, один оставленный вариант на самом деле является чистым C-интерфейсом вашей dll.И вам действительно нужно позаботиться о том, чтобы придерживаться чистой связи C (extern "C" объявление).

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

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

Еще одна вещь, которую следует помнить, это то, что вам будет еще труднее, если вы планируете использовать типы STL в интерфейсе вашей dll.Подробнее см. Контейнеры STL и двоичный интерфейс .

Назад к интерфейсу C

Поскольку мы столкнулись с той же проблемой в нашемКоманда, мы решили пойти на проект dll, имеющий:

  1. ... a C интерфейс и
  2. ... отдельный фасад библиотекав сопровождении

Библиотека фасад может быть либо статической библиотекой, скомпилированной в среде сборки dll-потребителя, либо библиотекой только с заголовками.В любом случае это очень тонкая оболочка вокруг хрупкого C интерфейса библиотеки DLL и может пересылать более объектно-ориентированный дизайн.По крайней мере, то, что делает:

  1. Группирует связанные функции с классами.
  2. Преобразует коды ошибок в исключения.
  3. Преобразует типы STL (строки, векторы и т. Д.)) к собственным типам (const char *, void *, длина буфера и т. д.)

Таким образом, мы могли бы сохранить преимущество версий dll, имеющих совместимый интерфейс и отсутствие необходимости (слишком) много заботысреды пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...