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

Удаление зависимостей Visual Studio 2010 MSVCR?

Я пробовал Google, но я не мог найти решение. Я пытаюсь изучить некоторые базовые С++. Я написал простой мир приветствия:

#include <stdio.h>
int main()
{
    printf("hello, world\n");
    return 0;
}

Скомпилировано и все! Отлично, я думал, поэтому я загрузил свою виртуальную машину с XP и никаких пакетов обновлений, а затем попытался запустить ее. Мне сказали, что мне нужна библиотека MSVCR. Есть ли способ полностью удалить эту зависимость? Я не хочу заполнять программу DLL. Я хочу, чтобы он исчез, полностью. Можно ли запустить и запустить программу, которая будет работать в XP и выше? Спасибо.

4b9b3361

Ответ 1

Технически возможно удалить эту зависимость в C, но я не уверен, что это возможно даже на С++. И в любом случае я бы не рекомендовал его. Вы теряете много вещей, которые CRT делает для вас за кулисами, большинство из которых вы не хотите, чтобы изобретать себя в худшем стиле. Во-первых, это библиотека времени выполнения, которая на самом деле вызывает вашу функцию main, а также вызывает конструкторы и деструкторы для глобальных и статических объектов С++.

Лучшим и самым простым решением, вероятно, является изменение того, как ваше приложение ссылается на библиотеки времени выполнения. У вас есть два разных варианта: динамически и статически. Динамическое связывание более эффективно с точки зрения памяти и означает, что ваше приложение будет использовать любые исправления ошибок, которые сделаны в библиотеке. Он полагается на текущую DLL, присутствующую для запуска вашего приложения. Статическая привязка фактически внедряет код библиотеки времени выполнения в ваше приложение во время фазы ссылки сборки. Это означает, что вы можете работать без распространения DLL, но есть важные оговорки.

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

  • Щелкните правой кнопкой мыши имя вашего проекта в обозревателе решений.
  • Разверните параметр "C/С++" в левом дереве и выберите пункт "Генерация кода".
  • В поле со списком свойств "Библиотека времени выполнения" выберите один из вариантов "Многопоточность".
    Отладочные сборки должны использовать "Multi-threaded Debug", в то время как сборки Release должны использовать "Multi-threaded".

Обратите внимание, что с тех пор, как вы используете VS 2010, вы все равно можете динамически связываться со временем выполнения и получить все преимущества этого без необходимости запуска установщика CRT на целевых компьютерах. Все, что вам нужно, это распространяемые DLL (ы), помещенные в ту же папку, что и исполняемый файл приложения. Это делает развертывание (и даже тестирование) очень простым и понятным. Вы найдете эти библиотеки как часть установки Visual Studio:

\Program Files\Visual Studio x.0\VC\redist\

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


Не могу ли я использовать время выполнения, которое поставляется с XP?

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

Ответ 2

Вы можете связать время выполнения MS статически, параметры проекта → C/С++ → генерация кода → многопоточность (или многопоточная отладка для настройки отладки). Тогда не потребуется DLL.

Ответ 3

вы можете удалить раздражающую библиотеку времени выполнения, сделайте следующее:
project properties > linker > input > ignore all default libraries> yes

это даст вам несколько проблем, с которыми вам нужно иметь дело, например, плавающие точечные номера не будут работать, стек памяти очень мал (около 3k), нет встроенной помощи в переполнении буфера и т.д., и вы не можете использовать стандартную библиотеку без копирования, вставляя ее в свой проект.

это также уменьшит размер .exe, почти эквивалентный, как если бы он был сделан вручную в сборке.