У меня есть вопрос об общих библиотеках / .dlls и импорте / экспорте классов. Из того, что я понял после некоторых исследований, есть два способа сделать это:
Просто используйте __declspec (dllexport / dllimport) перед классом и молитесь, чтобы разные версии компилятора одинаково манипулировали именами, и принимайте тот факт, что ваш .dll не будет использоваться другими компиляторами.
Используйте чистые виртуальные классы в dll в качестве интерфейсов. Тогда все классы, которые должны были бы экспортироваться, наследовали бы от них и должны реализовывать виртуальные функции. В этом случае DLL экспортирует только «фабричные» функции Construct / Destruct, которые создают и освобождают объекты.
Это единственные два способа, которые я знаю. Первый - нет-нет, поскольку он предлагает 0 переносимости. Второй, хотя и удобный и хороший программный дизайн для .dll, который выполняет цель, начинает раздражать, когда вы понимаете, что вам нужна отдельная функция конструктора для каждого другого конструктора, можно использовать только типы POD в качестве параметров, и вы потеряете много преимущества классов C ++, таких как перегруженные функции и аргументы функций по умолчанию.
Для .dll, которая должна предлагать пользователю библиотеку, набор классов, например, даже второй способ, становится действительно неудобным. Так что мне интересно, что решение здесь? Просто скомпилировать разные .dll с первым способом для каждого основного компилятора? Как работают версии больших библиотек с разделяемыми библиотеками? Например, wxWidgets также предлагает версию .dll. Как они достигают нормального использования классов конечным пользователем .dll, избегая решения интерфейса?