Ошибка связи со сторонней статической библиотекой, созданной в предыдущей версии Visual Studio

Я работаю над проектом, который ссылается на стороннюю статическую библиотеку (ее называют EXTERNALLIB). В Visual Studio 2005 я смог соединиться с EXTERNALLIB и создать работающий исполняемый файл. Сейчас мы используем Visual Studio 2008, и я получаю следующую ошибку:

fatal error C1047: The object or library file EXTERNALLIB was created with an older compiler than other objects; rebuild old objects and libraries.

Есть ли способ для меня, чтобы сказать компилятору правильно ссылаться на EXTERNALLIB? Я считаю, что проблема может быть связана с конкретными соглашениями о вызовах (__stdcall, __cdecl, __clrcall, __thiscall). Могу ли я указать в новой программе правильное соглашение о вызовах для старой библиотеки? Есть ли особые отзывы, которые я могу дать нашему поставщику (например, использовать APIENTRY в заголовочных файлах), чтобы эта проблема не возникала при будущих обновлениях компилятора?

Код написан на C++. У меня нет доступа к коду для EXTERNALLIB, и поэтому я не могу восстановить его самостоятельно.

1 ответ

Решение

Ваша проблема, вероятно, является результатом "код написан на C++". Связи ABI для C++ практически не определены ни одним стандартом и общеизвестно изменяемы от компилятора к компилятору. Я подозреваю, что VS пытается сказать вам, что ABI снова изменился, и в результате он не может напрямую связываться с библиотекой.

Эта проблема часто усугубляется желанием реализовать объекты C++ в DLL, но, к счастью, у вас нет такой проблемы здесь.

Один из подходов к решению, которое должно работать, состоит в том, чтобы создать оболочку для опубликованного API EXTERNALLIB с помощью C-вызываемого адаптера и связать все это в DLL. Создайте скин с более старой версией VS (в худшем случае бесплатную версию все еще можно найти). Убедитесь, что только extern "C" функции выставлены. Особенно убедитесь, что никакие глобальные объекты не выставляются из DLL (хотя они могут существовать в вашей оболочке).

Лучший ответ - вернуться к поставщику EXTERNALLIB и вежливо сообщить о сбое связи с текущим VS как об ошибке и запросить восстановленную версию.

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