Я смущен о бинарной совместимости скомпилированных библиотек между VS2010 и VS2012. Я хотел бы перейти на VS2012, однако многие SDK с двоичным кодом с закрытым исходным кодом доступны только для VS2010, например SDK для сопряжения аппаратных устройств.Совместимость библиотеки Binary C++ между VS2010 и VS2012?
Традиционно, насколько я знаю, Visual Studio была чрезвычайно разборчива относительно версий компилятора, а в VS2010 вы не могли ссылаться на библиотеки, которые были скомпилированы для VS2008.
Причина, по которой я сейчас запутался, заключается в том, что я перехожу к VS2012, и я попробовал несколько проектов, и, к моему большому удивлению, многие из них работают без перекрестных версий.
Примечание: Я не говорю о режиме v100, который, насколько я знаю, является просто графическим интерфейсом VS2012 над компилятором VS2010.
Я говорю об открытии VS2010 решения в VS2012, нажмите обновление и посмотри, что произойдет.
При связывании с некоторыми более крупными библиотеками, такими как boost, компиляция не работала, так как есть проверки для версии компилятора, и они создают ошибку и прерывают компиляцию. Некоторые другие библиотеки просто прерываются при отсутствующих функциях. Это поведение, которого я ожидал.
С другой стороны, многие библиотеки работают нормально, без ошибок или дополнительных предупреждений.
Как это возможно? Был ли VS2012 особым образом поддерживать двоичную совместимость с библиотеками VS2010? Это зависит от динамической или статической привязки?
И самый важный вопрос: несмотря на то, что во время компиляции ошибка не возникает, могу ли я доверять компилятору, что при связывании проекта VS2012 с компилируемыми библиотеками VS2010 ошибок не будет?
«многие из них работают без перекрестных версий». Только, насколько вам известно. Скорее всего, они просто выровняли 99% времени, а _seem_ - работать. Передача 'std :: deque' вокруг, вероятно, не покажет ошибку компилятора, но, вероятно, произойдет сбой. –
Окружающая среда VS2012 действительно ищет ваши различные инструментальные средства построения и позволяет использовать их в качестве альтернативы v110 (или CTP, если на то пошло). Его не VS2012 работает в какой-то магической альтернативной вселенной. Это буквально просто используется то, что вы сказали ему использовать для реализации сборки. Это также то, как CTP используется (или не используется) на досуге. – WhozCraig
У stdlib нет бинарной совместимости между версиями. Слишком много встроенных и изменяющихся структур данных. См. Также [Как создать автономную DLL-версию для выполнения во время выполнения на C++?] (Http://stackoverflow.com/a/6206219/209199) –