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