Ответ 1
Если он должен запускаться только в Windows, я бы открыл классы как объекты COM. Они все равно будут в DLL, и они могут использоваться любым языком, который понимает COM.
Предположим, у меня есть два проекта, которые я хотел бы связать вместе:
Я понимаю, что нет стандартного С++ ABI и что любые попытки напрямую связать эти два проекта на С++ не удастся. Что такое хороший автоматический способ создания уровня совместимости, который позволяет мне выполнить это?
Например, предположительно, библиотека С++ может открываться через интерфейс C. Тогда исполняемый файл будет иметь некоторые классы С++, которые переносят интерфейс C, открытый библиотекой С++. Поскольку существует стандартный ABI для C, он будет работать.
Вопрос только в том, как автоматически создавать интерфейсы C и С++ - ручное сохранение этого не было бы вариантом. Проект SWIG выглядит многообещающим, но, к сожалению, С++ не является одним из выходов SWIG, перечисленных на их веб-сайте. Есть ли способ сделать то, что я хочу, с помощью SWIG? Или есть другой проект, кроме SWIG, который поможет мне в этой задаче?
Или я об этом ошибаюсь?
Изменить: Основная библиотека С++ предназначена для кросс-платформенной. Очевидно, что исполняемый файл относится к Windows. Я не хочу загрязнять основную библиотеку настолько, что ее невозможно скомпилировать на других платформах.
Если он должен запускаться только в Windows, я бы открыл классы как объекты COM. Они все равно будут в DLL, и они могут использоваться любым языком, который понимает COM.
"Стандартный" способ сделать это, в Windows, - использовать COM-объекты. Итак, это, безусловно, хороший вариант. В системах Linux модель взаимодействия с модулем (например, взаимодействие с исполняемым DLL) очень различна, а ABI существуют для С++.
Если вы захотите сделать это вручную (создайте свою собственную COM-библиотеку), это может быть очень много работы со многими небольшими сложными проблемами, чтобы серьезно относиться. Вам понадобится кросс-модульная система RTTI, вам понадобится протокол запроса/определения интерфейса, какой-то механизм для управления памятью через модули и т.д. Помимо этого, чтобы "автоматизировать" его, вам, вероятно, понадобится комбинация MACRO и шаблонные мета-функции.
Один кросс-платформенный вариант, который я бы настоятельно рекомендовал вам рассмотреть или, по крайней мере, посмотреть, использует Boost.Python и язык Python как "клей" между вашими модулями. Библиотека Boost.Python в основном выполняет весь "автоматизированный экспорт/импорт классов", но экспортирует ваши классы и функции С++ как классы и функции Python. И это совершенно неинтрузивный и кросс-платформенный, так что это действительно идеальный пример автоматического экспорта. Таким образом, вы можете подумать о том, как использовать Python для написания высокоуровневого клея-кода или использовать Python в качестве промежуточного элемента между модулями С++ или даже переработать библиотеку Boost.Python для использования только механизмов "автоматического экспорта" для экспорта в любой интерфейс которую вы разрабатываете или используете.
Я уверен, что там много других подобных библиотек. Но вопрос номер один, конечно, вам действительно нужно? Вы можете использовать базуку, чтобы убить муху.
Почему бы не просто скомпилировать библиотеку с построителем С++?
Оглядываясь на swig (я знал, что swig должен иметь возможность обернуть С++ в C): SWIG и С++
Если базовая библиотека является кросс-платформенной, почему бы и не писать UI в качестве кросс-платформенного приложения Qt и не создавать все в Visual С++ в Windows.