Подтвердить что ты не робот

Компилятор GCC против MS С++ для поддержки двойной совместимости API

Я пришел из мира Linux и знаю множество статей о поддержке обратной бинарной совместимости (BC) динамического библиотечного API, написанного на языке С++. Одним из них является "Политики/проблемы совместимости с С++" на основе Itanium С++ ABI, который используется компилятором GCC. Но я не могу найти ничего подобного для компилятора Microsoft С++ (из MSVC).

Я понимаю, что большинство методов применимы к компилятору MS С++, и я хотел бы найти проблемы для компилятора, связанные с различиями ABI (макет v-table, mangling и т.д.)

Итак, мои вопросы следующие:

  • Знаете ли вы какие-либо различия между MS С++ и компиляторами GCC при сохранении BC?
  • Где я могу найти информацию о MS С++ ABI или о поддержке BC API в Windows?

Любая соответствующая информация будет высоко оценена.
Большое спасибо за вашу помощь!

4b9b3361

Ответ 1

Прежде всего, эти политики являются общими и не относятся только к gcc. Например: private/public mark в функциях является чем-то специфичным для MSVC, а не gcc.

Таким образом, в основном эти правила полностью применимы к MSVC и компилятору.

Но...

Вы должны помнить:

  • GCC/С++ сохраняет стабильный ABI с версии 3.4 и составляет около 7 лет (с 2004 года), в то время как MSVC разрывает свой ABI каждый основной выпуск: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) несовместимы с друг друга.
  • Некоторые часто используемые флаги с MSVC могут также ломать ABI (например, модель Exceptions)
  • MSVC имеет несовместимые времена выполнения для режимов Debug и Release.

Итак, да, вы можете использовать эти правила, но, как в обычном случае MSVC, он имеет гораздо больше причуд.

См. также " Некоторые мысли о бинарной совместимости", а Qt сохраняет стабильность ABI с MSVC.

Примечание. У меня есть некоторый опыт в этом, поскольку я следую этим правилам в CppCMS

Ответ 2

В Windows у вас есть 2 варианта для долгосрочной совместимости двоичных файлов:

  • COM
  • имитация COM

Посмотрите мой пост здесь. Там вы увидите способ создания библиотек DLL и доступа к DLL в двоично-совместимом виде в разных версиях компиляторов и компиляторов.

Интерфейс плагина С++ DLL

Ответ 3

Лучшим правилом для двоичной совместимости MSVC является использование интерфейса C. На мой взгляд, единственная функция С++, с которой вы можете справиться, - это интерфейсы с одним наследованием. Итак, представляем все как интерфейсы, которые используют типы данных C.

Вот список вещей, которые не совместимы с бинарными:

  • STL. Бинарный формат изменяется даже между debug/release и в зависимости от флагов компилятора, поэтому вам лучше не использовать кросс-модуль STL.
  • Куча. Не используйте new/malloc в одном модуле и delete/free в другом. Есть разные кучи, которые не знают друг о друге. Другая причина, по которой STL не будет работать с кросс-модулями.
  • Исключения. Не допускайте распространения исключений из одного модуля в другой.
  • RTTI/dynamic_casting типы данных из других модулей.
  • Не доверяйте другим функциям С++.

Короче говоря, С++ не имеет согласованного ABI, но C делает, поэтому избегайте возможностей С++, пересекающих модули. Поскольку одиночное наследование является простой v-таблицей, вы можете с пользой использовать его для раскрытия объектов С++, предоставляя им типы данных C и не выделяя перекрестные кучи. Это подход, используемый самими Microsoft, например, для Direct3D API. GCC может быть полезен для обеспечения стабильного ABI, но стандарт не требует этого, и MSVC использует эту гибкость.