Устранение проблемы несовместимости между компиляторами с динамическими библиотеками C++
..., продолжение этого.
Из ответов, которые мне дали на мой ссылочный вопрос, я узнал, что:
- разные компиляторы используют разные декорации имен, что делает невозможным использование динамической библиотеки C++, созданной с помощью компилятора A, в проекте, созданном с помощью компилятора B,
- библиотека может быть построена как статическая, сохраняя меня, включая n заголовочных и исходных файлов в проекте или экспорт символов. (Это все равно не сохранит перестройку библиотеки для использования с другим компилятором.)
Внимательно изучив SDL в свете сказанного, я понял, что его связывание имеет два уровня: в моем проекте SDL я статически связываюсь с libSDL.a, который, в свою очередь, динамически связывается с SDL. DLL, тем самым устраняя необходимость в разных версиях DLL для разных компиляторов.
Вопрос в том, действительно ли это так и является жизнеспособным решением проблемы, или я что-то упустил (и что)?
1 ответ
Решение
Я думаю, что ваш подход правильный. Я бы сказал так:
- Чтобы dll могла использоваться различными компиляторами, она должна содержать только функции C (они могут быть скомпилированы с использованием компилятора C++ с использованием
extern C
) - Как обычно с dll, можно использовать статическую библиотеку импорта, чтобы функции в dll могли вызываться напрямую, а не загружаться по имени
- Вместо обычной библиотеки импорта вы могли бы иметь библиотеку-обертку, которая оборачивает функции DLL библиотеки C в классы и функции C++.