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

StackOverflow https://stackoverflow.com/questions/4782714

Вопрос

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

Я понимаю, что большинство методов применимы к компилятору MS C ++, и я хотел бы узнать компилятор-специфический Проблемы, связанные с различиями ABI (макет V-таблица, искажение и т. Д.)

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

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

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

Это было полезно?

Решение

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

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

Но...

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

  1. GCC/C ++ сохраняет стабильную ABI с 3,4, и это составляет около 7 лет (с 2004 года), в то время как MSVC разбивает свой ABI каждый основной выпуск: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) не совместимы друг с другом.
  2. Некоторые часто флаги, используемые с MSVC, также могут сломать ABI (например, модель исключений)
  3. MSVC имеет несовместимую время запуска для режимов отладки и выпуска.

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

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

Обратите внимание, что у меня есть некоторый опыт работы с этим, когда я следую за этими правилами в CPPCMS

Другие советы

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

  1. Компонент
  2. имитируя ком

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

C ++ DLL Plugin

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

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

  • STL. Бинарный формат меняется даже между отладкой/выпуском, и в зависимости от флагов компилятора, так что вам лучше не использовать Cross-Module STL.
  • Куча. Не надо new / malloc в одном модуле и delete / free в другой. Есть разные кучи, которые не знают друг о друге. Еще одна причина, по которой STL не будет работать поперечным.
  • Исключения. Не позволяйте исключениям распространяться из одного модуля в другой.
  • RTTI/Dynamic_casting DataTypes из других модулей.
  • Не доверяйте другим функциям C ++.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top