VC9 и VC8 lib совместимость
-
05-07-2019 - |
Вопрос
(Оригинальный вопрос был задан там: http: //www.ogre3d .org / phpBB2 / viewtopic.php? t = 44832 )
Кто-то спросил: " Хотелось бы собрать все в vs2008 (VC9), PhysX SDK построен на vs2005 (VC8). Может ли это вызвать какие-либо проблемы при использовании всех скомпилированных библиотек vc9 и в сочетании с этой библиотекой vc8? & Quot;
Я ответил, что за день до того, как я попытался использовать файл .lib (и файл .dll), созданный с помощью VC8, и включить его в скомпилированный исполняемый файл vc9, компилятор не смог открыть файл .lib.
Теперь другие ответили, что сделали это без проблем ....
Я не могу найти информацию о совместимости lib между vc9 и vc8. Р>
так ... Помощь?
Решение
Формат библиотеки: COFF ( http: // msdn.microsoft.com/en-us/library/7ykb2k5f(VS.71).aspx ), также COFF используется в формате PE. Таким образом, я ожидаю, что большинство, если не все библиотеки, созданные с использованием vc8, будут связаны с vc9.
Однако я обнаружил в msdn поток, в котором MS, похоже, не гарантирует, что библиотеки, скомпилированные с VC8, будут хорошо связываться с VC9. http: // social .msdn.microsoft.com / Форум / EN-US / vcgeneral / резьба / 8042a534-aa8b-4f99-81ee-e5ff39ae6e69 / )
Принимая во внимание эти 2 бита информации, я бы пришел к выводу: хотя MS не гарантирует полную 100% совместимость, я ожидаю, что в большинстве случаев подключение библиотеки vc8 к vc9 будет работать.
Надеюсь, это поможет. Постскриптум Вы пишете "Компилятору не удалось открыть файл .lib". Линкер - это тот, кто пытается открыть библиотеки, которые нужно связать, а не компилятор.
Другие советы
Это работает, но у вас возникают проблемы при совместном использовании объектов CRT / STL.
Поэтому, когда вы делаете 'new' в библиотеке vc8 и возвращаете ее в функцию vc9, которая, в свою очередь, удаляет этот объект, вы получаете утверждение от delete.
T* funcInVc8Lib()
{
return new T();
}
void funcInVC9Program()
{
T* p = funcInVc8Lib();
// ...
delete p; // it should at least assert here (in _CrtIsValidHeapPtr() )
}