Ошибка связи со сторонней статической библиотекой, созданной в предыдущей версии Visual Studio - PullRequest
2 голосов
/ 22 сентября 2009

Я работаю над проектом, который ссылается на стороннюю статическую библиотеку (ее называют 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 Ответ

5 голосов
/ 22 сентября 2009

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

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

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

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

...