Устранение проблемы несовместимости между компиляторами с динамическими библиотеками C++

..., продолжение этого.

Из ответов, которые мне дали на мой ссылочный вопрос, я узнал, что:

  • разные компиляторы используют разные декорации имен, что делает невозможным использование динамической библиотеки C++, созданной с помощью компилятора A, в проекте, созданном с помощью компилятора B,
  • библиотека может быть построена как статическая, сохраняя меня, включая n заголовочных и исходных файлов в проекте или экспорт символов. (Это все равно не сохранит перестройку библиотеки для использования с другим компилятором.)

Внимательно изучив SDL в свете сказанного, я понял, что его связывание имеет два уровня: в моем проекте SDL я статически связываюсь с libSDL.a, который, в свою очередь, динамически связывается с SDL. DLL, тем самым устраняя необходимость в разных версиях DLL для разных компиляторов.

Вопрос в том, действительно ли это так и является жизнеспособным решением проблемы, или я что-то упустил (и что)?

1 ответ

Решение

Я думаю, что ваш подход правильный. Я бы сказал так:

  • Чтобы dll могла использоваться различными компиляторами, она должна содержать только функции C (они могут быть скомпилированы с использованием компилятора C++ с использованием extern C)
  • Как обычно с dll, можно использовать статическую библиотеку импорта, чтобы функции в dll могли вызываться напрямую, а не загружаться по имени
  • Вместо обычной библиотеки импорта вы могли бы иметь библиотеку-обертку, которая оборачивает функции DLL библиотеки C в классы и функции C++.
Другие вопросы по тегам