Compartilhar via


Recursos da biblioteca CRT

Este tópico discute os diversos arquivos. lib que compõem as bibliotecas de tempo de execução C, bem como suas opções de compilador associado e diretivas de pré-processador.

Bibliotecas em tempo de execução do C (CRT)

As seguintes bibliotecas contêm as funções da biblioteca de tempo de execução C.

Biblioteca de tempo de execução do C (sem iostream ou biblioteca padrão C++)

DLL associado

Características

Opção

Diretivas de pré-processador

libcmt

Nenhum, vínculo estático.

Vínculo estático e multithread

/MT

MT

Msvcrt

msvcr120.dll

Multithread, dynamic link (biblioteca de importação para MSVCR120. DLL). Lembre-se de que, se você usar a biblioteca C++ padrão, o programa será necessário MSVCP120. DLL para ser executado.

/MD

MT, DLL

Libcmtd

Nenhum vínculo estático

Link de vários segmentos, estático (depuração)

/MTd

DEBUG, MT

Msvcrtd

msvcr120d.dll

Multithread, dynamic link (biblioteca de importação para MSVCR120D. DLL) (depuração).

/MDd

DEBUG MT, DLL

msvcmrt.lib

Nenhum vínculo estático

Biblioteca estática do tempo de execução C. Usado para código gerenciado/nativo misto.

/clr

 

msvcurt.lib

Nenhum vínculo estático

Tempo de execução C biblioteca estática compilada como código MSIL puro de 100%. Todo o código está em conformidade com a especificação ECMA URT MSIL.

/CLR: puro

 

Dica

A CRT (libc, libcd.lib) single-threaded (anteriormente o /ML ou /MLd Opções) não está mais disponível.Em vez disso, use o CRT multithread.Consulte Desempenho de bibliotecas multithread.

Se você vincular o programa de linha de comando sem uma opção de compilador que especifica uma biblioteca em tempo de execução C, o vinculador use LIBCMT. LIB. Isso é diferente das versões anteriores do Visual C++ que usado LIBC. BIBLIOTECA, a biblioteca de thread único, em vez disso.

Usar o CRT estaticamente vinculado significa que nenhuma informação de estado salva pela biblioteca de tempo de execução C seja local para aquela instância do CRT. Por exemplo, se você usar strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l ao usar um CRT vinculado estaticamente, a posição do strtok analisador não está relacionada ao strtok estado usado em código no mesmo processo (mas em uma outra DLL ou EXE) que está vinculado a outra instância do CRT estática. Por outro lado, o CRT dinamicamente vinculado compartilha estado para todo o código dentro de um processo que esteja vinculado dinamicamente a CRT. Essa preocupação não se aplica se você usar as novas versões mais seguras dessas funções; Por exemplo, strtok_s não tem esse problema.

Como uma DLL criada ao vincular a um CRT estático terá seu próprio estado CRT, não é recomendável vincular estaticamente a CRT em uma DLL, a menos que as conseqüências são especificamente desejadas e compreendidas. Por exemplo, se você chamar set_se_translator em um executável que carrega a DLL vinculada a seu próprio CRT estático, as exceções de hardware geradas pelo código na DLL não serão detectadas pelo tradutor, mas as exceções de hardware geradas pelo código no executável principal serão capturadas.

Se você estiver usando o /clr switch do compilador, seu código será vinculado com uma biblioteca estática, msvcmrt.lib. A biblioteca estática fornece um proxy entre o código gerenciado e nativo CRT. Não é possível usar o CRT vinculado estaticamente ( /MT ou /MTd Opções) com /clr. Usar as bibliotecas vinculadas dinamicamente (/MD ou /MDd) em vez disso.

Se você estiver usando o /clr:pure switch do compilador, seu código será vinculado a biblioteca estática msvcurt.lib. Assim como acontece com /clr, você não pode vincular à biblioteca vinculada estaticamente.

Para obter mais informações sobre como usar o CRT com /clr, consulte Assemblies mistos (nativos e gerenciados); para /clr:pure, consulte Código puro e verificável (C++/CLI).

Para criar uma versão de depuração do seu aplicativo, o Debug sinalizador deve ser definida e o aplicativo deve ser vinculado a uma versão de depuração de uma dessas bibliotecas. Para obter mais informações sobre como usar as versões de depuração dos arquivos de biblioteca, consulte técnicas de depuração CRT.

Esta versão do Visual C++ não é compatível com o padrão C99.

Biblioteca Padrão C++

Biblioteca Padrão C++

Características

Opção

Diretivas de pré-processador

LIBCPMT. LIB

Vínculo estático e multithread

/MT

MT

MSVCPRT. LIB

Multithread, dynamic link (biblioteca de importação para MSVCP120.dll)

/MD

MT, DLL

LIBCPMTD. LIB

Vínculo estático e multithread

/MTd

DEBUG, MT

MSVCPRTD. LIB

Multithread, dynamic link (biblioteca de importação para MSVCP120D. DLL)

/MDd

DEBUG MT, DLL

Observação LIBCP. LIB e LIBCPD. LIB (por meio do antigo /ML e /MLd Opções) foram removidos. Use LIBCPMT. LIB e LIBCPMTD. Em vez disso, LIB por meio de /MT e /MTd Opções.

Quando você cria uma versão de lançamento do seu projeto, uma das bibliotecas de tempo de execução básicas do C (LIBCMT. LIB, MSVCMRT. LIB, MSVCRT. LIB) é vinculado por padrão, dependendo da opção de compilador que você escolher (multithreaded, DLL, /clr). Se você incluir o Arquivos de cabeçalho da Biblioteca Padrão C++ em seu código, uma biblioteca C++ padrão será vinculada no automaticamente pelo Visual C++ em tempo de compilação. Por exemplo:

#include <ios> 

Para alterar qual biblioteca em tempo de execução C básica está vinculada no Visual Studio, abra as páginas de propriedades para o seu projeto. Abra o Propriedades de configuração, C/C++, geração de código página e altere o biblioteca de tempo de execução configuração. Para alterar a biblioteca do Common Language Runtime, abra as páginas de propriedades para o seu projeto. Abra o Propriedades de configuração, C/C++, geral página e, em seguida, altere o suporte a Common Language RunTime configuração.

Qual é a diferença entre Msvcrt. dll e msvcr120?

O Msvcrt. dll agora é uma "DLL conhecida", que significa que ele é um componente do sistema de propriedade e criados pelo Windows. Ele destina para uso futuro somente pelos componentes de nível de sistema.

Quais problemas existirem se um aplicativo usa Msvcrt. dll e msvcr120?

Se você tiver um arquivo. lib ou. obj que precisa vincular MSVCRT, não deve ter recompilá-lo para trabalhar com o novo Msvcrt no Visual C++. O arquivo. lib ou. obj pode contar com os tamanhos, deslocamentos de campo ou nomes de função de membro de várias classes de CRT ou variáveis e aqueles devem todos ainda existir uma maneira compatível. Quando você vincular novamente em Msvcrt, sua imagem final EXE e DLL agora tem uma dependência em msvcr120 em vez do Msvcrt. dll.

Se você tiver mais de uma DLL ou EXE, você pode ter mais de um CRT, se você estiver usando versões diferentes do ou não Visual C++. Por exemplo, a vinculação estática CRT em várias DLLs pode apresentar o mesmo problema. Os desenvolvedores encontrar esse problema com CRTs estáticos tem sido instruídos a compilar com /MD para usar a DLL do CRT. Agora que a DLL de CRT foi renomeada para msvcr120, os aplicativos podem ter alguns componentes vinculados a Msvcrt. dll e outros para msvcr120. Se suas DLLs passam recursos CRT além do limite Msvcrt. dll e msvcr120, você encontrar problemas com CRTs incompatíveis e precisará recompilar o projeto com o Visual C++.

Se seu programa está usando mais de uma versão do CRT, algum cuidado é necessária ao transmitir determinados objetos CRT (como identificadores de arquivos, locais e variáveis de ambiente) em limites de DLL. Para obter mais informações sobre os problemas envolvidos e como resolvê-los, consulte Erros em potencial passando por objetos CRT em limites de DLL.

Consulte também

Outros recursos

Referência da biblioteca em tempo de execução do C