Компилятор GCC против MS C ++ для поддержания API обратной бинарной совместимости
-
23-10-2019 - |
Вопрос
Я приехал из мира 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 и общему компилятору.
Но...
Вы должны помнить:
- GCC/C ++ сохраняет стабильную ABI с 3,4, и это составляет около 7 лет (с 2004 года), в то время как MSVC разбивает свой ABI каждый основной выпуск: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) не совместимы друг с другом.
- Некоторые часто флаги, используемые с MSVC, также могут сломать ABI (например, модель исключений)
- MSVC имеет несовместимую время запуска для режимов отладки и выпуска.
Так что да, вы можете использовать эти правила, но, как и в обычном случае с MSVC, у него гораздо больше причуд.
Смотрите также "Некоторые мысли о бинарной совместимости«И QT сохраняет, что они также стабильны с MSVC.
Обратите внимание, что у меня есть некоторый опыт работы с этим, когда я следую за этими правилами в CPPCMS
Другие советы
В Windows у вас в основном есть 2 варианта для долгосрочной бинарной совместимости:
- Компонент
- имитируя ком
Проверьте мой пост здесь. Там вы увидите способ создания DLL и доступа к DLL в бинарном порядке, совместимых с различными компиляторами и версиями компилятора.
Лучшее правило для бинарной совместимости 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 использует эту гибкость.