Поделиться через


Функции библиотеки CRT

В этом разделе обсуждаются различные LIB-файлы, входящие в библиотеки времени выполнения C, а также связанные параметры компилятора и директивы препроцессора.

Библиотеки среды выполнения C (CRT)

Функции библиотеки времени выполнения C содержатся в следующих библиотеках.

Библиотека времени выполнения C (без iostream и стандартной библиотеки C++)

Связанная DLL

Характеристики

Параметр

Директивы препроцессора

libcmt.lib

Нет, статическая компоновка

Многопоточная, статическая компоновка.

/MT

_MT

msvcrt.lib

msvcr120.dll

Многопоточная, динамическая компоновка (библиотека импорта для MSVCR120.DLL). Следует помнить, что при использовании стандартной библиотеки C++ для запуска программы необходима библиотека MSVCP120.DLL.

/MD

_MT, _DLL

libcmtd.lib

Нет, статическая компоновка

Многопоточная, статическая компоновка (отладочная).

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr120d.dll

Многопоточная, динамическая компоновка (библиотека импорта для MSVCR120D.DLL) (отладочная).

/MDd

_DEBUG, _MT, _DLL

msvcmrt.lib

Нет, статическая компоновка

Статическая библиотека времени выполнения C. Используется для смешанного управляемого/неуправляемого кода.

/clr

 

msvcurt.lib

Нет, статическая компоновка

Статическая библиотека времени выполнения C, компилированная как 100 % чистый код MSIL. Весь код соответствует спецификации ECMA URT для MSIL.

/clr:pure

 

Примечание

Однопоточные CRT (libc.lib, libcd.lib) (ранее параметры /ML или /MLd) больше недоступны.Вместо этого используйте многопоточные CRT.См. Производительность многопотоковых библиотек.

При компоновке программы из командной строки без параметра компилятора, который задает библиотеку времени выполнения C, компоновщик будет использовать LIBCMT.LIB. Это поведение отличается от предыдущих версий Visual C++, которые использовали однопоточную библиотеку LIBC.LIB.

Использование статически скомпонованных CRT означает, что все сведения о состоянии, сохраненные библиотекой времени выполнения C, будут локальны по отношению к этому экземпляру CRT. Например, если используется strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l при использовании статически скомпонованной CRT, позиция анализатора strtok не связана с состоянием strtok, который используется в коде в этом же процессе (но в другом файле DLL или EXE), скомпонованным с другим экземпляром статической библиотеки CRT. Напротив, динамически скомпонованная библиотека CRT позволяет использовать состояние всему коду в процессе, который динамически скомпонован с этой библиотекой CRT. Это не относится к новым более безопасным версиям этих функций; например, эта проблема не распространяется на strtok_s.

Поскольку библиотека DLL, собранная путем компоновки со статической библиотекой CRT, будет иметь собственное состояние CRT, не рекомендуется использовать статическую компоновку с CRT для DLL без понимания последствий и конкретной необходимости. Например, при вызове функции _set_se_translator в исполняемом файле, который загружает библиотеку DLL, скомпонованную с собственной статической библиотекой CRT, все аппаратные исключения, создаваемые в коде библиотеки DLL, не будут перехватываться транслятором, в отличие от аппаратных исключений, создаваемых в коде основного исполняемого файла.

Если используется параметр компилятора /clr, код будет скомпонован со статической библиотекой msvcmrt.lib. Эта статическая библиотека предоставляет функцию прокси между управляемым кодом и неуправляемой средой CRT. Невозможно использовать статически скомпонованные CRT (параметры /MT или /MTd) с параметром /clr. Вместо этого используйте динамически скомпонованные библиотеки (/MD или /MDd).

Если используется параметр компилятора /clr:pure, код будет скомпонован со статической библиотекой msvcurt.lib. Как и в случае параметра /clr, компоновка со статически скомпонованной библиотекой не допускается.

Дополнительные сведения об использовании CRT с /clr см. в разделе Смешанные (собственные и управляемые) сборки; дополнительные сведения о /clr:pure см. в разделе Чистый и проверяемый код (C++/CLI).

Для сборки отладочной версии приложения должен быть определен флаг _DEBUG, и приложение должно быть скомпоновано с отладочной версией одной из этих библиотек. Дополнительные сведения об использовании отладочных версий файлов библиотек см. в разделе Методы отладки CRT.

Эта версия Visual C++ не совместима со стандартом C99.

Стандартная библиотека C++

Стандартная библиотека C++

Характеристики

Параметр

Директивы препроцессора

LIBCPMT.LIB

Многопоточная, статическая компоновка.

/MT

_MT

MSVCPRT.LIB

Многопоточная, динамическая компоновка (библиотека импорта для MSVCP120.dll)

/MD

_MT, _DLL

LIBCPMTD.LIB

Многопоточная, статическая компоновка.

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

Многопоточная, динамическая компоновка (библиотека импорта для MSVCP120D.DLL)

/MDd

_DEBUG, _MT, _DLL

Обратите внимание, что LIBCP.LIB и LIBCPD.LIB (с помощью старых параметров /ML и /MLd) были удалены. Вместо этого используйте LIBCPMT.LIB и LIBCPMTD.LIB с помощью параметров /MT и /MTd.

При сборке финальной версии проекта одна из базовых библиотек времени выполнения C (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) будет скомпонована по умолчанию, в зависимости от выбранного параметра компилятора (многопоточный, DLL, /clr). Если в код включен один из Файлы заголовков стандартных библиотек C++, Visual C++ автоматически скомпонует стандартную библиотеку C++ во время компиляции. Например:

#include <ios> 

Чтобы указать библиотеки времени выполнения Basic C, которые будут скомпонованы в Visual Studio, откройте страницу свойств проекта. Откройте последовательно страницы Свойства конфигурации, C/C++ и Создание кода и измените настройки библиотеки времени выполнения. Чтобы изменить библиотеку среды CLR, откройте страницы свойств проекта. Откройте последовательно страницы Свойства конфигурации, C/C++, Общие, а затем измените настройки Поддержки CLR.

Чем отличаются msvcrt.dll и msvcr120.dll?

Msvcrt.dll теперь "известная библиотека DLL"; это означает, что она является системным компонентом, принадлежащим ОС Windows и собираемым ею. Она предназначена для использования в будущем только компонентами системного уровня.

Какие проблемы возникают, если приложение использует и msvcrt.dll, и msvcr120.dll?

При наличии LIB или OBJ файла, который требуется связать с msvcrt.lib, нет необходимости перекомпилировать его для работы с новой библиотекой msvcrt.lib в Visual C++. LIB или OBJ файл может использовать размеры, смещения полей или имена функций-членов различных классов и переменных CRT, и все они по-прежнему будут совместимы. Если необходимо выполнить повторную компоновку с msvcrt.lib, окончательный образ EXE и DLL будет зависеть от msvcr120.dll, а не от msvcrt.dll.

При наличии нескольких файлов DLL или EXE возможно наличие нескольких CRT, вне зависимости от используемой версии Visual C++. Например, статическая компоновка библиотеки CRT с несколькими библиотеками DLL может представлять такую же проблему. Разработчики, которые столкнулись с этой проблемой со статическими CRT, получили инструкции компилировать с параметром /MD для использования CRT DLL. После того как CRT DLL переименована в msvcr120.dll, одни компоненты приложения могут быть связаны с msvcrt.dll, а другие — с msvcr120.dll. Если библиотеки DLL передают ресурсы CRT через границы msvcrt.dll и msvcr120.dll, возникнут проблемы несоответствия библиотек CRT и потребуется выполнить повторную компиляцию проекта с помощью Visual C++.

Если программа использует нескольких версий CRT, необходимо быть осторожным при передаче некоторых объектов CRT (например, дескрипторов файлов, языковых стандартов и переменных среды) через границы библиотеки DLL. Дополнительные сведения об этих проблемах и способах их устранения см. в разделе Потенциальные ошибки при передаче объектов CRT через границы DLL.

См. также

Другие ресурсы

Справочник по библиотеке времени выполнения C