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

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

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

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

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

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


person zyndor    schedule 05.06.2009    source источник


Ответы (1)


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

  • Чтобы dll могли использовать разные компиляторы, она должна содержать только функции C (они могут быть скомпилированы с помощью компилятора C++ с использованием extern C)
  • Как обычно с dll, можно использовать статическую библиотеку импорта, чтобы функции в dll можно было вызывать напрямую, а не загружать по имени.
  • Вместо обычной библиотеки импорта у вас может быть библиотека-оболочка, которая оборачивает функции C dll в классы и функции C++.
person James Hopkin    schedule 05.06.2009
comment
спасибо за указание на это (и извините): сказать, что проблема не существует со статическими библиотеками, просто неправильно. сейчас поправлю. - person zyndor; 05.06.2009