Microsoft Visual Studio ~ Библиотека времени выполнения C / C ++ ~ Статическая / динамическая компоновка

Я пользователь Microsoft Visual Studio. У меня вопрос о «Библиотеке времени выполнения C / C ++».

Я создал «Пустой проект» с исходным файлом «.cpp» «main.cpp», содержащим следующий код:

#include <iostream>

int main(void)
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

«iostream - это файл заголовка, который используется для ввода / вывода на языке программирования C ++. Он является частью стандартной библиотеки C ++».

  1. Есть ли разница между «Библиотекой времени выполнения C / C ++» и «Стандартной библиотекой C / C ++»?

  2. Как узнать, связана ли библиотека «C / C ++ Runtime Library» с проектом статически или динамически?

  3. Как мне узнать, где находится эта библиотека в файловой системе?

  4. В случае, если «Библиотека времени выполнения C / C ++» динамически связана с проектом, как я могу узнать, какая «.dll» используется и где находится использованная «.dll» в файловой системе?

  5. Предположим, что я статически привязываю «Библиотеку времени выполнения C / C ++» к проекту, могу ли я быть уверен, что исполняемый файл, созданный из исходного кода, будет работать на всех платформах Windows (XP / Vista / Seven / ..., 32 бит / 64 немного)?

  6. Каковы преимущества / недостатки динамического связывания «библиотеки времени выполнения C / C ++» с проектом?

  7. Следует ли связывать «библиотеку времени выполнения C / C ++» с проектом статически или динамически?


person Léa Massiot    schedule 07.02.2013    source источник
comment
Я думаю, вы найдете больше информации на сайте Microsoft. Короче говоря, множество программ требует, чтобы вы загрузили vc_redists, так что у меня нет причин не ожидать, что он / может быть установлен.   -  person Bartek Banachewicz    schedule 07.02.2013
comment
Не могли бы вы уточнить, где найти информацию на веб-сайте Microsoft? Не уверен, что понимаю вторую часть вашего ответа. В случае динамической компоновки нужно предоставить сборки, если их нет в целевой системе ... не так ли?   -  person Léa Massiot    schedule 07.02.2013
comment
Компоненты среды выполнения можно загрузить с сайта Microsoft. Это нужно сделать только один раз, поэтому, если ваша программа не первая, использующая конкретную версию компилятора, она просто работает.   -  person Bo Persson    schedule 07.02.2013
comment
Стандартный способ - использование динамического связывания. Проблема зависимостей времени выполнения решается путем создания установочного пакета - взгляните на проект «Установка и развертывание Visual Studio». Статическая компоновка используется только в некоторых особых случаях.   -  person Alex F    schedule 07.02.2013
comment
@AlexFarber на самом деле почти всегда, когда вы распространяете автономный exe, что часто делается, безопаснее создавать статические ссылки. Автономный exe иногда предпочтительнее из-за проблем с привилегиями при установке. (например, chiark.greenend.org.uk/~sgtatham/putty/ download.html - удобно, то же самое для winscp, vnc и других интересных инструментов для Windows)   -  person thang    schedule 07.02.2013


Ответы (2)


Термин «библиотека времени выполнения C / C ++» ничего не означает, это примерно имя настройки проекта в среде IDE. Проект + Свойства, C / C ++, Генерация кода, Настройка библиотеки времени выполнения. Здесь вы можете выбрать между / MD и / MT.

С параметром по умолчанию / MD ваша программа будет использовать версию DLL библиотек времени выполнения. На вашем компьютере они были скопированы в c: \ windows \ system32 и / или c: \ windows \ syswow64 установщиком Visual Studio. И у вас есть их копии в подкаталоге vc / redist каталога установки VS, чтобы вы могли использовать их при создании установщика для своей программы. Их три версии: x86 для 32-битных процессоров Intel, x64 для 64-битных процессоров Intel и arm для процессоров ARM. Выберите подходящий вариант в зависимости от платформы, которую вы выбрали в своем проекте.

Соответствующие имена DLL:

  • msvcr110.dll: библиотека времени выполнения C (memcpy и др.)
  • msvcp110.dll: стандартная библиотека C ++ (std :: string и др.)
  • vccorlib110.dll: библиотека времени выполнения для приложений Магазина Windows
  • vcomp110.dll: библиотека времени выполнения для OpenMP (см. #pragma omp)
  • atl110.dll: библиотека времени выполнения для проектов ATL
  • mfc110 * .dll: библиотеки времени выполнения и локализации для проектов MFC
  • vcamp110.dll: библиотека времени выполнения для проектов AMP

На вашем компьютере у вас также есть отладочные сборки этих DLL, скопированные в каталог Windows установщиком VS. У них одно и то же имя с добавленной буквой «d». Полезно только для отладки вашего кода, вы не можете распространять их. Соответствующий параметр библиотеки времени выполнения - / MDd.

Большинству проектов на C ++ нужны только msvcr110.dll и msvcp110.dll, вы бы знали, когда решите использовать другие библиотеки, поскольку для них есть определенные шаблоны проектов и настройки.

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

Вы можете избежать зависимости от этих DLL, изменив параметр Runtime Library на / MT. В этом случае код поддержки среды выполнения связан с вашей программой, и вам нужно будет развернуть только один EXE. Когда вы это сделаете, он, конечно, станет больше, иногда значительно, особенно когда вы используете MFC.

Использование / MT рискованно, если вы создаете библиотеки DLL, а также EXE. В итоге вы получите несколько копий CRT в вашей программе. Это было особенно проблемой с более ранними версиями VS, где каждый CRT получал свою собственную кучу, а не с VS2012. Но у вас все еще могут быть уродливые проблемы во время выполнения, например, если у вас более одной переменной "errno". Настоятельно рекомендуется использовать / MD, чтобы избежать такой потери.

Ваша программа будет работать в Windows Vista, 7 и 8. Поддержка XP ослабевает, вам понадобится VS Update 1 и измените настройку набора инструментов в проекте с «v110» на «v110_xp», чтобы создать программу, которая все еще работает в XP. . При этом теряются некоторые функции, связанные с локалью и локальным хранилищем потока, требуется тестирование.

person Hans Passant    schedule 07.02.2013
comment
Возможно, стоит отметить, что v110_xp также работает с Windows Server 2003. - person Michal Hosala; 05.12.2014

Здесь ничего не происходит ... Пожалуйста, свяжитесь с нами, если обнаружите ошибку.

1. Есть ли разница между «Библиотекой времени выполнения C / C ++» и «Стандартной библиотекой C / C ++»?

Да и нет. Иногда люди используют библиотеку времени выполнения для обозначения всего и вообще игнорируют стандартную библиотеку (для инструментов Microsoft). Однако технически библиотека времени выполнения загружается во время выполнения, поэтому она включает пару .lib (import lib) и .dll. Подробнее см. Здесь: http://msdn.microsoft.com/en-us/library/vstudio/abx4dbyh(v=vs.100).aspx

Технически libc * - стандартные библиотеки, а * crt - библиотеки времени выполнения.

2. Как узнать, связана ли библиотека «C / C ++ Runtime Library» с проектом статически или динамически?

Если вы используете IDE (VS2010, другие похожи), это находится в свойствах проекта:

-  configuration properties
        - c/c++
               - code generation
                      [Runtime Library]

3. Как узнать, где находится эта библиотека в файловой системе?

Файлы lib находятся в каталоге lib вашего SDK (если вы установили более позднюю версию SDK для Windows) или в каталоге Visual C ++.

4. В случае, если «Библиотека времени выполнения C / C ++» динамически связана с проектом, как я могу узнать, какой «.dll» используется и где в файловой системе находится используемый «.dll»?

Вы можете выяснить, какие из них используются, с помощью инструмента зависимостей. http://www.dependencywalker.com/

Библиотеки DLL находятся где-то в каталоге Windows. Они перемещают их, и теперь они находятся в забавных местах с манифестами и прочим, чтобы отслеживать версию. Я бы не стал слишком об этом беспокоиться. Если вам нужно об этом беспокоиться, возможно, что-то не так. Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/windows/desktop/aa375365(v=vs.85).aspx http://en.wikipedia.org/wiki/Side-by-side_assembly

Если это вызывает беспокойство, вы можете связать распространяемый пакет со своим установщиком: Разница между распространяемым пакетом Visual Studio и Visual Studio SP1

5. Предположим, что я статически привязываю «Библиотеку времени выполнения C / C ++» к проекту, могу ли я быть уверен, что исполняемый файл, созданный из исходного кода, будет работать на всех платформах Windows (XP / Vista / Seven / ..., 32 бит / 64 бит)?

Да, если вы связываете статически, тогда вы в большей безопасности с точки зрения невозможности найти dll. Однако это увеличивает размер исполняемого файла. Есть и другие последствия с точки зрения поведения ... Трудно перечислить, но разница заключается в том, что библиотека находится в dll, а не скомпилирована в ваш exe.

6. Каковы преимущества / недостатки динамического связывания «библиотеки времени выполнения C / C ++» с проектом?

Зачем использовать dll:

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

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

Почему бы не использовать dll:

a - много проблем с работой с dll. Если вы забудете связать Redist, может появиться много проблем.

b - наличие большего количества dll для загрузки и выгрузки приводит к более медленному запуску и выходу.

Наверное, по другим причинам, о которых я не подумал ...

7. Следует ли связывать «библиотеку времени выполнения C / C ++» с проектом статически или динамически?

Это действительно зависит от обстоятельств. Я лично предпочитаю статическую связь. Ненавижу возиться в поисках правильного redist / dll / и т. Д.

person thang    schedule 07.02.2013