GCC против компилятора MS C ++ для поддержки обратной двоичной совместимости API - PullRequest
19 голосов
/ 24 января 2011

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

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

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

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

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

Ответы [ 3 ]

22 голосов
/ 24 января 2011

Прежде всего, эти политики являются общими и не относятся только к 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 поддерживает стабильный ABI с MSVC.

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

8 голосов
/ 28 января 2011

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

  1. COM
  2. , имитирующий COM

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

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

7 голосов
/ 29 января 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...