Visual Studio 2010 MSVCR удаление зависимости? - PullRequest
14 голосов
/ 29 января 2012

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

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

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

Ответы [ 3 ]

20 голосов
/ 29 января 2012

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

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

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

  1. Щелкните правой кнопкой мыши имя своего проекта в обозревателе решений.
  2. Разверните параметр «C / C ++» в левом дереве и выберите пункт «Генерация кода».
  3. В поле со списком свойств «Библиотека времени выполнения» выберите один из параметров «Многопоточный».
    Отладочные сборки должны использовать «Многопоточную отладку», в то время как релизные сборки должны использовать «Многопоточность».

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

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

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


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

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

3 голосов
/ 24 марта 2014

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

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

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

3 голосов
/ 29 января 2012

Вы можете связать среду выполнения MS статически, Параметры проекта -> C / C ++ -> Генерация кода -> Многопоточная (или Многопоточная отладка для конфигурации отладки). В таком случае DLL не требуется.

...