4

Я смущен о бинарной совместимости скомпилированных библиотек между 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 ошибок не будет?

+1

«многие из них работают без перекрестных версий». Только, насколько вам известно. Скорее всего, они просто выровняли 99% времени, а _seem_ - работать. Передача 'std :: deque' вокруг, вероятно, не покажет ошибку компилятора, но, вероятно, произойдет сбой. –

+0

Окружающая среда VS2012 действительно ищет ваши различные инструментальные средства построения и позволяет использовать их в качестве альтернативы v110 (или CTP, если на то пошло). Его не VS2012 работает в какой-то магической альтернативной вселенной. Это буквально просто используется то, что вы сказали ему использовать для реализации сборки. Это также то, как CTP используется (или не используется) на досуге. – WhozCraig

+2

У stdlib нет бинарной совместимости между версиями. Слишком много встроенных и изменяющихся структур данных. См. Также [Как создать автономную DLL-версию для выполнения во время выполнения на C++?] (Http://stackoverflow.com/a/6206219/209199) –

ответ

3

«Многие библиотеки работают нормально. Как это возможно? »

1) lib скомпилирован для использования статического RTL, поэтому код не будет тянуть вторую DLL DLL, которая сталкивается.

2) код вызывает только функции (и использует структуры и т.д.), что полностью в заголовочных файлах так не вызывает ошибку компоновщика, или вызовы функций, которые до сих пор присутствуют в новом РТЛ так Безразлично 't вызывают ошибку компоновщика,

3) не вызывает ничего со структурами, которые изменили макет или значение, чтобы оно не сработало.

# 3 это тот, о котором нужно беспокоиться. Вы можете использовать импорт, чтобы увидеть, что он использует, и составить полный список, но нет документации или гарантии того, какие из них совместимы. Просто потому, что он, кажется, работает, не означает, что у него нет скрытой ошибки.

Существует также возможность

4) в SDK драйвера или другой код, который довольно низкий уровень был написан, чтобы избежать использования стандартных вызовов библиотеки полностью.

также (не ваша ситуация, я думаю) DLL могут быть изолированы и иметь собственный RTL, а не передавать материал туда и обратно (например, распределение памяти и освобождение) между различными режимами. В-COM-серверы работают таким образом. DLLs может сделать это вообще, если вы будете осторожны в том, что вы проходите и возвращаетесь, и что вы делаете с вещами, такими как указатели.Например, Crypto ++ инициализируется подпрограммами памяти из прилагаемой программы и не выставляет malloc'ed память из версии RTL, с которой она была скомпилирована.

+0

Возможно, проблемы совместимости не с инструментальной цепочкой, а с макетом памяти общие типы данных и предположения, испеченные в функции, которые были встроены. –

Смежные вопросы