Вопрос

Я часто сталкиваюсь с программами Windows, которые объединены в MSVCRT (или их более современные эквиваленты) с исполняемыми файлами программ.На обычном ПК я обнаружил множество копий одних и тех же .DLL.Насколько я понимаю, MSVCRT — это библиотека времени выполнения C, в некоторой степени аналогичная glibc/libc.so в *nix.

Почему программы Windows должны брать с собой библиотеки C, а не просто использовать общесистемную библиотеку libc?


Обновлять:благодаря Shog9 я начал читать о SxS, что еще больше открыло мне глаза на проблемы привязки DLL (DLL Hell) - http://blogs.msdn.com/b/martynl/archive/2005/10/13/480880.aspx это одно полезное введение в проблему...

Это было полезно?

Решение

[В настоящее время я занимаюсь сопровождением технологии Native SxS в Microsoft]

Новые версии MSVCRT выпускаются вместе с новыми версиями Visual Studio и отражают изменения в наборе инструментов C++.Чтобы программы, скомпилированные с версиями VS, выпущенными после продолжения конкретной версии Windows, могли работать на более низком уровне (например, проекты VS 2008 в Windows XP), MSVCRT является распространяемым, поэтому его можно установить там.

При установке CRT библиотеки помещаются в %windir%\winsxs\, который является глобальным системным расположением, для этого требуются права администратора.

Поскольку некоторые программы не хотят поставляться с установщиком или не хотят, чтобы пользователю требовались права администратора на компьютере для запуска их установщика, они помещают CRT непосредственно в тот же каталог, что и приложение, для частного использования.Итак, на типичной машине вы найдете множество программ, которые выбрали это решение.

Другие советы

В Windows на самом деле нет «общесистемной библиотеки libc».

В *nix обычно есть один компилятор, один компоновщик, а также четко определенный формат объектного файла, соглашение о вызовах и спецификация преобразования имен.Обычно эта штука поставляется вместе с ОС.Полуособый статус компилятора (плюс упор на переносимость между различными *nix-системами) означает, что некоторые вещи могут быть ожидал находиться там и иметь имя и/или версию таким образом, чтобы программы могли легко найти и использовать его.

В Windows все более фрагментировано.Компилятор не входит в комплект ОС, поэтому людям придется приобретать его самостоятельно.Каждый компилятор предоставляет свой собственный CRT, который может иметь или не иметь те же функции, что и MSVCRT.Также не существует единой истинной спецификации по соглашениям о вызовах или по тому, как имена должны отображаться в библиотеках, поэтому у разных компиляторов (с разными способами выполнения задач) могут возникнуть проблемы с поиском функций в библиотеке.

Кстати, имя должно быть здесь подсказкой;MSVCRT — это сокращение от «MicroSoft Visual C++ RunTime».На самом деле это не «общесистемная» библиотека в том смысле, в каком, скажем, kernel32 это - это просто библиотека времени выполнения, используемая компиляторами MS, которую они предположительно использовали при сборке Windows.Другие компиляторы, возможно, могли бы использовать его, но (1) могут возникнуть проблемы с лицензированием;и (2) компиляторы будут привязывать свой код к коду MS - это означает, что (2a) у них больше не будет возможности добавлять во время выполнения или исправлять ошибки, если не считать надежды, что MS их исправит;и (2b) если MS решит изменить то, что находится в RTL (что они могут делать по своему желанию и, вероятно, есть в каждой новой версии VC++), или то, как отображаются имена, эти другие программы могут сломаться.

Короткий ответ?Потому что до SxS MSVCRT не было надежно версионировано!Можете ли вы представить себе безумие, которое произойдет, если программы, скомпилированные и протестированные с использованием libc 5, начнут молча использовать libc 6?В такой ситуации мы находились на протяжении многих лет в Windows.Большинство из нас с радостью никогда больше не будут доверять MS сохранение изменений в версии.

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

В мире Windows очень невежливо ожидать, что ваши пользователи выйдут и найдут и установят отдельную библиотеку для использования вашего приложения.Вы убедитесь, что все зависимости, не являющиеся частью хост-системы, включены в ваше приложение.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top