C Совместимость с версией библиотеки времени выполнения: обновления требуют перестроений? - PullRequest
1 голос
/ 01 сентября 2009

Как вы создаете библиотеку (статическая библиотека или dll / так), чтобы она не чувствительна к будущим обновлениям системных библиотек времени выполнения C?

В конце июля Microsoft обновлено куча библиотек, включая библиотеки времени выполнения C.Наше приложение написано с использованием смеси MFC / C ++ / VB и некоторых сторонних библиотек, включая библиотеки с закрытым исходным кодом.

Я был занят перекомпиляцией всех библиотек, к которым у нас есть исходники, но яинтересно, действительно ли это необходимо?Что произойдет, если мы подключим или загрузим библиотеку, созданную для более ранней версии среды выполнения C?

При повторной компиляции, какие настройки компилятора и компоновщика должны быть одинаковыми между основным приложением и вспомогательными библиотеками?Я обнаружил, что настройки библиотеки времени выполнения должны быть одинаковыми (мы используем многопоточные версии / MD и / MDd), но я беспокоюсь о других настройках.На самом деле я перенес все настройки в листы свойств Visual Studio и использую одни и те же листы для всех наших разных проектов, но это не работает для сторонних библиотек, и я думаю, что это излишне.

Я заметил, что компоновщик выдаст предупреждение о конфликтующих библиотеках, но предлагает просто игнорировать библиотеки по умолчанию.Насколько это безопасно?Это кажется очень уродливым решением проблемы.

Ответы [ 2 ]

1 голос
/ 01 сентября 2009

Если вы загружаете сторонние библиотеки как библиотеки DLL, они могут зависеть от версий среды выполнения, отличных от вашего исполняемого файла, если

  • вы не передаете параметры типов, которые зависят от библиотек времени выполнения (например, типы STL)
  • сторонняя библиотека может загрузить версию среды выполнения, с которой она была построена или статически связана со средой выполнения

Итак, вам не нужно перекомпилировать библиотеки DLL.

Если вы статически При связывании с библиотеками или при передаче типов, определенных в DLL-библиотеках времени выполнения, вы можете столкнуться с некоторыми проблемами с символами, которые уже импортированы в вашу библиотеку, поэтому, скорее всего, вам придется перекомпилировать их.

1 голос
/ 01 сентября 2009

Если вы или ваши сторонние компоненты статически связываетесь с устаревшими библиотеками C, все в порядке; Обновление этих библиотек не повлияет на вашу программу. Конечно, вы не будете извлекать выгоду ни от исправления ошибок, ни от повышения производительности, ни от того, что у вас есть. Если вы перекомпилируете свой код, чтобы воспользоваться новыми настройками, все переключатели времени выполнения должны быть одинаковыми. Это всегда так, независимо от того, когда и почему ваши библиотеки компилируются. Вероятно, безопасно игнорировать библиотеки по умолчанию (я делал это годами без труда).

Динамически связанные библиотеки - другая история. Если вы полагаетесь на целевую систему, имеющую определенную версию данной библиотеки DLL, и вместо этого у нее есть другая несовместимая версия, то вы облажались. Традиционное решение этой проблемы - связать все необходимые библиотеки с исполняемым файлом. Новая штука Microsoft по параллельной сборке также может помочь, но ее всегда было слишком сложно настроить, чтобы я с ней возился. Возможно, вам повезет больше.

...