Подтвердить что ты не робот

Является ли MSVCRT под Windows похожим на glibc (libc) под * nix?

Я часто сталкиваюсь с программами 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 является одним из полезных вступлений в проблему...

4b9b3361

Ответ 1

[Я являюсь ведущим разработчиком технологии Native SxS в Microsoft]

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

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

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

Ответ 2

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

Ответ 3

В Windows на самом деле нет "системного libc".

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

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

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

Ответ 4

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

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

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