VC9 и VC8 lib совместимость - PullRequest
       52

VC9 и VC8 lib совместимость

3 голосов
/ 05 октября 2008

(Там был задан оригинальный вопрос: http://www.ogre3d.org/phpBB2/viewtopic.php?t=44832)

Кто-то спросил: «Хотя я хотел бы собрать все в vs2008 (VC9), PhysX SDK собран с vs2005 (VC8). Не вызовет ли это каких-либо проблем, используя все скомпилированные библиотеки vc9 и в сочетании с этой библиотекой vc8?»

Я ответил, что за день до того, как я попытался использовать .lib-файл (и .dll), сгенерированный с помощью VC8, и включить его в скомпилированный exe-файл vc9, компилятор не смог открыть .lib-файл.

Теперь другие ответили, что сделали это без проблем ...

Я не могу найти информацию о совместимости lib между vc9 и vc8.

так ... Помощь?

Ответы [ 2 ]

3 голосов
/ 05 октября 2008

Формат lib - 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/Forums/en-US/vcgeneral/thread/8042a534-aa8b-4f99-81ee-e5ff39ae6e69/)

Принимая во внимание эти 2 бита информации, я бы пришел к выводу: хотя MS не гарантирует полную 100% совместимость, я бы ожидал, что в большинстве случаев подключение библиотеки vc8 к vc9 будет работать.

Надеюсь, это поможет. Постскриптум Вы пишете: "Компилятору не удалось открыть файл .lib." Компоновщик - это тот, кто пытается открыть библиотеки для компоновки, а не компилятор.

3 голосов
/ 05 октября 2008

Работает, но возникают проблемы при совместном использовании объектов 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() )
 }
...