У нас только что был интересный опыт попытки связать набор кода, скомпилированный с помощью Visual Studio Express 2008, с .lib, скомпилированным с помощью Visual Studio 2003. Все на C ++. Если быть точным, это было ядро SystemC 2.2.0, которое было скомпилировано в VS2003 в .lib, и модель SystemC. который был скомпилирован в VS2008.
При связывании мы продолжали получать ошибку, что несколько символов из файла SystemC.lib (т. Е. Скомпилированных в VS2003) не были найдены во время связывания. Мы получаем следующую ошибку (в нескольких вариантах):
SystemC.lib(sc_port.obj) : error LNK2001: unresolved external symbol "public: vo
id __thiscall std::_String_base::_Xran(void)const " (?_Xran@_String_base@std@@QB
EXXZ)
Копаясь из различных источников, выяснилось, что функция, которую ожидал найти .lib, была следующей:
Undecoration of :- "?_Xran@_String_base@std@@QBEXXZ"
is :- "public: void __thiscall std::_String_base::_Xran(void)const "
В то время как файл библиотеки, с которым VS2008 пытался связать (libcpmt.lib), использовал другое соглашение о вызовах:
Undecoration of :- "?_Xran@_String_base@std@@SAXXZ"
is :- "public: static void __cdecl std::_String_base::_Xran(void)"
Я попытался выяснить, почему возникла эта несовместимость, но в конце концов я сдался, перекомпилировал тот же самый проект Visual Studio в VS2008 и использовал этот SystemC.lib вместо файла из VS2003. Теперь все работало отлично.
Итак, основной вопрос здесь: что изменилось с VS2003 на VS2008, что заставило бы некоторые функции изменить свои соглашения о вызовах? И есть ли какой-то волшебный флаг, который можно передать компоновщику в VS2008 для использования какой-либо другой библиотеки, где функции имеют то же соглашение о вызовах, что и в компиляции VS2003?
Обновление, сводка ответов на данный момент: очень вероятно, что Microsoft изменит ABI C ++ (не C, просто C ++) с одной основной версии Visual Studio на другую. Также могут быть другие изменения в библиотеках, вызывающие несовместимость. Лучший совет - перекомпилировать .lib для каждой версии VS. По сути, просто отправьте его пользователям в исходном виде и попросите их скомпилировать его локально, используя любую версию VS, которую они установили.
Основная проблема была обнаружена с помощью рекомендаций в:
Обратите внимание, что эти вопросы не дали ответа на этот вопрос: