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

У меня есть два сценария. Предположим, у меня есть 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 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам