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 de tempo de execução c (CRT)
As seguintes bibliotecas contêm as funções de biblioteca de tempo de execução C.
Biblioteca de tempo de execução c (sem iostream ou biblioteca C++ padrão) |
DLL associado |
Características |
Opção |
Diretivas de pré-processador |
---|---|---|---|---|
libcmt.lib |
Nenhum, link estático. |
Link multissegmentado, estático |
_MT |
|
Msvcrt.lib |
msvcr110.dll |
Multithreaded, dinâmico link (biblioteca de importação para MSVCR110.DLL).Lembre-se de que, se você usar a biblioteca C++ padrão, o programa será necessário MSVCP110.DLL para executar. |
_MT, _DLL |
|
sendo |
Nenhum link estático |
Link multissegmentado, estático (depuração) |
/MTd |
DEBUG, _MT |
Msvcrtd.lib |
msvcr110d.dll |
Multithreaded, dinâmico link (biblioteca de importação para MSVCR110D.DLL) (depuração). |
/MDd |
DEBUG, _MT, _DLL |
msvcmrt.lib |
Nenhum link estático |
Biblioteca estática C Runtime.Usado para código nativo/gerenciado misto. |
/clr /clr:oldSyntax |
|
msvcurt.lib |
Nenhum link estático |
C Runtime library estática compilado como código MSIL puro de 100%.Todo o código cumpre a especificação ECMA URT MSIL. |
/clr:pure |
|
Observação |
---|
CRT single-threaded (libc.lib, libcd.lib) (anteriormente conhecido como o /ML ou /MLd opções) não está mais disponível.Em vez disso, use CRT multithread.Consulte Desempenho de bibliotecas multithread. |
Se você vincular seu programa a partir da linha de comando sem a opção de compilador que especifica uma biblioteca de tempo de execução C, o vinculador irá usar LIBCMT.LIB.Isso é diferente de versões anteriores do Visual C++ que usado LIBC.LIB, biblioteca de thread único, em vez disso.
Usar um CRT vinculada estaticamente implica que as informações de estado salvas pela biblioteca c runtime será locais para essa 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 relacionado a strtok estado usado no código no mesmo processo (mas em uma outra DLL ou EXE) que está vinculado a outra instância do CRT estático.Em contraste, a CRT dinamicamente vinculada compartilha estado para todo o código dentro de um processo 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.
Porque uma DLL criada vinculando 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 vinculados ao seu próprio CRT estático, as exceções de hardware geradas pelo código da dll não serão detectadas pelo tradutor, mas exceções de hardware geradas pelo código executável principal serão detectadas.
Se você estiver usando o /clr opção de compilador, seu código será vinculado com uma biblioteca estática, msvcmrt.lib.Biblioteca estática fornece um proxy entre código gerenciado e nativo CRT.Não é possível usar a CRT vinculada estaticamente ( /MT ou /MTd opções) com /clr.Usar bibliotecas vinculadas dinamicamente (/MD ou /MDd) em vez disso.
Se você estiver usando o /clr:pure opção de compilador, seu código será vinculado com msvcurt.lib biblioteca estática.Como com /clr, não é possível vincular com a biblioteca vinculada estaticamente.
Para obter mais informações sobre o uso de CRT com /clr, consulte Mistos Assemblies (nativos e gerenciados); for /clr:pure, see Código puro e verificável (C + + / CLI).
Para criar uma versão de depuração do seu aplicativo, o Debug sinalizador deve ser definido e o aplicativo deve ser vinculado com uma versão de depuração de uma dessas bibliotecas.Para obter mais informações sobre as versões de depuração dos arquivos de biblioteca, consulte CRT Debugging Techniques.
Esta versão do Visual C++ não é compatível com o padrão C99.
Biblioteca C++ padrão
Biblioteca C++ padrão |
Características |
Opção |
Diretivas de pré-processador |
---|---|---|---|
LIBCPMT.LIB |
Link multissegmentado, estático |
/MT |
_MT |
MSVCPRT.LIB |
Multithreaded, dinâmico link (biblioteca de importação para MSVCP110.dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Link multissegmentado, estático |
/MTd |
DEBUG, _MT |
MSVCPRTD.LIB |
Multithreaded, dinâmico link (biblioteca de importação para MSVCP110D.DLL) |
/MDd |
DEBUG, _MT, _DLL |
Observação LIBCP.LIB e LIBCPD.LIB (via o antigo /ML e /MLd opções) foram removidos.Use LIBCPMT.LIB e LIBCPMTD.LIB em vez disso, por meio de /MT e /MTd opções.
Quando você constrói uma versão do seu projeto, uma das bibliotecas de tempo de execução c básicas (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) é vinculado por padrão, dependendo da opção de compilador escolhido (multithread, DLL, /clr).Se você incluir um do Arquivos de cabeçalho no seu código, uma biblioteca C++ padrão será vinculada na automaticamente pelo Visual C++ em tempo de compilação.Por exemplo:
#include <ios>
Qual é a diferença entre Msvcrt. dll e msvcr110.dll?
O Msvcrt. dll agora é uma "DLL conhecida", que significa que ele é um componente do sistema de propriedade e criados pelo Windows.Ele é destinado a uso futuro somente por componentes de sistema.
Quais problemas existirem se um aplicativo usa Msvcrt. dll e msvcr110.dll?
Se você tiver um arquivo. lib ou. obj que precisa para vincular a msvcrt.lib, você não deverá recompilá-lo para trabalhar com o msvcrt.lib de novo 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 existem de forma compatível.Quando você revincula contra msvcrt.lib, a imagem final EXE e DLL agora têm uma dependência no msvcr110.dll em vez de Msvcrt. dll.
Se você tiver mais de uma DLL ou EXE, você pode ter mais de um CRT, ou não estão usando versões diferentes do Visual C++.Por exemplo, vincular estaticamente a CRT em várias DLLs pode apresentar o mesmo problema.Os desenvolvedores encontrar esse problema com CRTs estáticos tenham sido instruídos para compilar com /MD usar a DLL de CRT.Agora que a DLL de CRT foi renomeada para msvcr110.dll, os aplicativos podem ter alguns componentes vinculados Msvcrt. dll e outros para msvcr110.dll.Se suas DLLs passam recursos CRT em limite Msvcrt. dll e msvcr110.dll, você encontrar problemas com CRTs incompatíveis e precisará recompilar o projeto com o Visual C++.
Se seu programa estiver usando mais de uma versão de CRT, algum cuidado é necessário quando passando certos objetos de CRT (como identificadores de arquivo, localidades e variáveis de ambiente) em limites DLL.Para obter mais informações sobre os problemas envolvidos e como resolvê-los, consulte Erros possíveis passar objetos de CRT em limites DLL.