Решение проблемы множественных ЭЛТ - PullRequest
3 голосов
/ 08 марта 2010

Я знаю, что есть несколько похожих вопросов, но я не думаю, что у них действительно такие же требования, как у меня.

Наша DLL скомпилирована с Visual Studio 2005 и должна связываться с конкретной версией CRT из-за ограничений при установке. Это абсолютно, перекомпиляция его с последней версией не является решением.

Мы недавно обновили наши библиотеки Boost. Однако, когда я собрал Boost, он автоматически использовал последнюю версию CRT. Теперь, когда я связываю Boost с нашей программой, он создает зависимость как от самой новой (неправильной) версии CRT, так и от старой (правильной) версии CRT. Зависимость от самой новой версии должна исчезнуть.

Как лучше всего решить эту проблему? На данный момент лучшее, что я могу придумать, это перестроить Boost, используя старую версию, но я понятия не имею, как это легко сделать без изменения исходного кода.

Если бы был способ заставить Visual Studio использовать определенную версию CRT глобально (не для каждого проекта), это было бы замечательно. Или способ просто удалить самую новую версию CRT, но я уверен, что это невозможно, так как я думаю, что это считается частью ОС.

Ответы [ 3 ]

5 голосов
/ 08 марта 2010

AFAIK, не рекомендуется использовать разные версии CRT. В отличие от .NET, где вы можете ссылаться на dll .NET 1.1 из dll .NET 2.0, Unmanaged не обеспечивает такой гибкости.

Поскольку вы не можете обновить свои библиотеки для использования более новых ЭЛТ, единственное, что вы можете сделать, это восстановить Boost в VS2005.

Также не рекомендуется связывать две библиотеки разных ЭЛТ. Это может привести к таким проблемам, как повреждение памяти.

Примечание. Каждая Visual Studio имеет свою версию CRT по умолчанию, к которой относятся все библиотеки DLL.

Также я не понял "убрать новый ЭЛТ". Вам нужно будет установить Visual Studio Redist для каждой используемой версии Visual Studio. (Этот Redist содержит CRT DLL) http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx

3 голосов
/ 09 марта 2010

Решением было ручное изменение встроенного манифеста для удаления зависимости от новейшего CRT, поскольку он построен с динамически связанным CRT. Но я сомневаюсь в безопасности этого.

По некоторым причинам принудительное включение файла targetxs во время процесса сборки Boost не заставило его нацелиться на указанную CRT.

0 голосов
/ 09 марта 2010

Вы должны найти, какая именно конструкция в проекте boost вводит зависимость от неправильного CRT, и удалить / изменить эту конструкцию. Это может быть что-то в файле .vcproj или какой-то манифест или что-то в этом роде.

CRT VC ++ 2005 и VC ++ 2008 содержат более или менее одинаковые примитивы - вы, вероятно, можете полностью перекомпилировать boost с помощью VC ++ 2005 или немного его настроить и перекомпилировать после этого. Да, это потребует некоторых усилий, но это единственный путь - и ваш код, и дополнительный код должны быть скомпилированы с версией CRT, которую вы хотите использовать.

...