Microsoft Visual Studio ~ C / C ++ Runtime Library ~ Статическое / динамическое связывание

Я пользователь Microsoft Visual Studio.
Мой вопрос о «C / C ++ Runtime Library».

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

#include <iostream>

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

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

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

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

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

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

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

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

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

38

Решение

Термин «C / C ++ Runtime Library» ничего не значит, это примерно название настройки проекта в IDE. Project + Properties, 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 et al)
  • 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 , При этом теряется некоторая функциональность, связанная с локалью и локальным хранилищем потоков, поэтому требуется тестирование.

55

Другие решения

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

1. Есть ли разница между «C / C ++ Runtime Library» и «C / C ++ Standard Library»?

И да и нет. Иногда люди используют библиотеку времени исполнения для обозначения всего и игнорируют стандартную библиотеку (для инструментов 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 (если вы установили более позднюю версию windows sdk) или в каталоге Visual C ++.

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

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

Библиотеки находятся где-то в каталоге 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 ++ Runtime Library» с проектом, могу ли я быть уверен, что исполняемый файл, сгенерированный из исходного кода, будет работать на всех платформах Windows (XP / Vista / Seven / …, 32-разрядная версия / 64 бит)

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

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

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

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

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

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

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

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

Вероятно, другие причины, о которых я не думал …

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

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

20

По вопросам рекламы [email protected]