Экспорт классов в dll переносимым способом, без использования интерфейсов? - PullRequest
0 голосов
/ 22 мая 2011

У меня есть вопрос об общих библиотеках / .dlls и импорте / экспорте классов. Из того, что я понял после некоторых исследований, есть два способа сделать это:

Просто используйте __declspec (dllexport / dllimport) перед классом и молитесь, чтобы разные версии компилятора одинаково манипулировали именами, и принимайте тот факт, что ваш .dll не будет использоваться другими компиляторами. Используйте чистые виртуальные классы в dll в качестве интерфейсов. Тогда все классы, которые должны были бы экспортироваться, наследовали бы от них и должны реализовывать виртуальные функции. В этом случае DLL экспортирует только «фабричные» функции Construct / Destruct, которые создают и освобождают объекты.

Это единственные два способа, которые я знаю. Первый - нет-нет, поскольку он предлагает 0 переносимости. Второй, хотя и удобный и хороший программный дизайн для .dll, который выполняет цель, начинает раздражать, когда вы понимаете, что вам нужна отдельная функция конструктора для каждого другого конструктора, можно использовать только типы POD в качестве параметров, и вы потеряете много преимущества классов C ++, таких как перегруженные функции и аргументы функций по умолчанию.

Для .dll, которая должна предлагать пользователю библиотеку, набор классов, например, даже второй способ, становится действительно неудобным. Так что мне интересно, что решение здесь? Просто скомпилировать разные .dll с первым способом для каждого основного компилятора? Как работают версии больших библиотек с разделяемыми библиотеками? Например, wxWidgets также предлагает версию .dll. Как они достигают нормального использования классов конечным пользователем .dll, избегая решения интерфейса?

1 Ответ

0 голосов
/ 23 июня 2012

Решение с наличием отдельной DLL для каждой версии компилятора.В то же время это еще не официальная функция.Вы никогда не узнаете, нарушит ли следующий пакет обновления совместимость или нет, никто не даст вам точный список ключей компилятора / компоновщика, которые будут поддерживать / нарушать совместимость и т. Д. Я слышал достоверные слухи о том, что Windows8 наконец-то реализовала это правильно.

Кстати, версию-кандидату на выпуск Visual Studio 2012 можно загрузить с: http://msdn.microsoft.com/en-us/vstudio/bb984878.aspx. Может быть, стоит попробовать?

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