Совместимость библиотеки ABI между версиями Visual Studio - PullRequest
13 голосов
/ 10 февраля 2012

У меня есть два сценария.Предположим, у меня есть 3 общие библиотеки, которые экспортируют символы C ++, каждая из которых построена на VS7.1, VS8 и VS9.Я собираю все 3 в VS9.По какой-то причине это работает.Мне не нужно перекомпилировать первые 2 библиотеки в VS9 для компоновщика VS9, чтобы успешно найти символы и связать их.

Теперь, если у меня есть библиотека, которая экспортирует символы только с использованием синтаксиса C (extern "C") это то же самое?Я слышал, что люди говорят, что ABI для C стандартизирован, поэтому есть некоторая гарантия, что вы можете использовать библиотеку C, скомпилированную в Visual Studio 8, во всех версиях Visual Studio.

По сути, комбинациявсех этих вещей сбивает с толку.Я не уверен в том, какие гарантии я имею между связыванием совместно используемых библиотек на основе C ++ и C (используя их соответствующие библиотеки импорта) между различными версиями Visual Studio.Я хотел бы услышать общее согласие в отношении прямой и обратной совместимости обеих библиотек импорта C И C ++ или статических библиотек в любой другой версии Visual Studio.

Причина, по которой это возниклодля меня это потому, что есть библиотеки с закрытым исходным кодом, которые я использую, которые были скомпилированы в Visual Studio .NET 2003 (VS7.1).Моя команда считает, что это привязывает нас к компилятору VS 7.1, однако я вышел и протестировал эти библиотеки как в VS8, так и в VS9, даже в VS2010, и они прекрасно связываются.Однако я не уверен в присущей ему опасности.Обратите внимание, что рассматриваемая библиотека имеет вариант C и вариант C ++.По сути, вариант C - это стандартный экспорт C, а библиотека C ++ - это абстракция над библиотекой C и классами экспорта.

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Проблема может заключаться не только в различиях ABI (соглашения о вызовах и т. Д.) Между этими версиями VS, но также в удаленных / измененных символах в системных библиотеках DLL. См. эту таблицу для подробного сравнения системных библиотек DLL между VS8 (2005, Windows SDK 5.0) и VS9 (2008, Windows SDK 6.0).

См. Также матрица совместимости для Windows SDK.

enter image description here

2 голосов
/ 10 февраля 2012

extern "C" экспортируемые символы отличаются от символов C ++. C ++ имеет искажение имени (см. http://en.wikipedia.org/wiki/Name_mangling).

Составление символов C ++ может варьироваться от версии компилятора к версии компилятора, поэтому в вашей настройке VS7 / 8/9 одно и то же имя метода C ++ может быть искажено для разных имен.

По сути, ваша команда, похоже, права: вы будете заблокированы в той же основной версии компилятора, которая использовалась для компиляции вашей библиотеки.

...