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

Совместимость библиотеки ABI между версиями Visual Studio

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

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

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

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

4b9b3361

Ответ 1

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

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

введите описание изображения здесь

Ответ 2

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

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

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