C em time de execução bibliotecas
Este tópico aborda sistema autônomo diversos arquivos .lib que compõem o C em time de execução bibliotecas, bem sistema autônomo suas opções do compilador associada e sistema autônomo diretivas de pré-processador.
Bibliotecas c em tempo de execução (CRT)
As seguintes bibliotecas contêm o C em time de execução funções da biblioteca.
C em time de execução biblioteca (sem iostream ou biblioteca C++ padrão) |
DLL associado |
Características |
Opção |
Diretivas de pré-processador |
---|---|---|---|---|
libcmt.lib |
Nenhum, vínculo estático. |
Link estático e multithread |
_MT |
|
Msvcrt.lib |
msvcr90.dll |
Dinâmico, multithread link (biblioteca de importação para MSVCR90.DLL).Esteja ciente de que, se você usar a biblioteca C++ padrão, seu programa precisará MSVCP90.DLL para executar. |
_MT, _DLL |
|
Libcmtd.lib |
Nenhum vínculo estático |
Link multithread, estático (Depurar) |
/ MTd |
_DEBUG, _MT |
Msvcrtd.lib |
msvcr90d.dll |
Link dinâmico, multithread (biblioteca de importação para MSVCR90D.DLL) (Depurar). |
/ MDd |
_DEBUG _MT, _DLL |
msvcmrt.lib |
msvcm90.dll |
Biblioteca de importação C tempo de execução.Usado para o código gerenciado/nativo misto. |
/clr |
|
msvcurt.lib |
msvcm90.dll |
Tempo de execução C importar biblioteca compilada sistema autônomo código MSIL puro 100 %.Todo o código está em conformidade com a especificação ECMA URT para MSIL. |
/ CLR: puro |
|
Observação: |
---|
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 a CRT multithread.Consulte Desempenho de bibliotecas multithread. |
Se você vincular o seu programa a partir da linha de comando sem uma opção do compilador que especifica um C em time de execução biblioteca, o vinculador usará LIBCMT.LIB.Isso é diferente das versões anteriores do Visual C++ que usado LIBC.LIB, a biblioteca de thread único, em vez disso.
Usar a CRT vinculada estaticamente significa que qualquer informação de estado salva por biblioteca de tempo de execução C será local 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 das strtok analisador é não relacionado a strtok estado usado em código no mesmo processo (mas em uma DLL ou EXE diferentes) que esteja vinculado a outra instância do CRT estático. Por outro lado, a CRT dinamicamente vinculada compartilha estado para todo o código em um processo que está dinamicamente vinculado a CRT.Esse problema não se aplica se você usar as novas versões mais seguras dessas funções; por exemplo, strtok_s não é necessário que esse problema.
Como uma DLL criada pela vinculação 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 carrega a DLL vinculados ao seu próprio CRT estático, quaisquer exceções de hardware geradas pelo código da dll não serão ser detectadas pelo conversor, mas exceções de hardware geradas pelo código executável principal serão ser detectadas.
Se você estiver usando o /clr comutador de compilador, seu código será vinculado com uma biblioteca de importação, msvcmrt.lib. A biblioteca de importação faz referência a uma nova biblioteca, msvcm90.dll, que fornece um proxy entre seu código gerenciado e nativo CRT.Não é possível usar a CRT vinculada estaticamente (/MT ou / MTd opções) com /clr. Usar as bibliotecas vinculadas dinamicamente (/MD or / MDd) em vez disso.
Se você estiver usando o / CLR: puro comutador de compilador, seu código será vinculado com a importação de biblioteca msvcurt.lib, que também faz referência msvcm90.dll.sistema autônomo ocorre com /clr, não é possível vincular com a biblioteca vinculada estaticamente.
Para obter mais informações sobre como usar a CRT com /clr, consulte Misto (nativos e gerenciados) assemblies; para / CLR: puro, see Código puro e que.
Para compilação uma versão de depurar do aplicativo, a _DEBUG sinalizar deve ser definida e o aplicativo deve estar vinculado com uma versão de depurar de uma dessas bibliotecas.Para obter mais informações sobre como usam as versões de depurar 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 estático e multithread |
/MT |
_MT |
MSVCPRT.LIB |
Link dinâmico, multithread (biblioteca de importação para MSVCP90.dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Link estático e multithread |
/ MTd |
_DEBUG, _MT |
MSVCPRTD.LIB |
Link dinâmico, multithread (biblioteca de importação para MSVCP90D.DLL) |
/ MDd |
_DEBUG _MT, _DLL |
Observação a partir de Visual C++ 2005LIBCP.LIB e LIBCPD.LIB (via o antigo /ML e / MLd opções) foram removidas.Use LIBCPMT.LIB e LIBCPMTD.LIB via o /MT e / MTd opções.
Quando você cria uma versão de lançamento do seu projeto, uma das básicas bibliotecas time de execução C (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) está vinculada por padrão, dependendo da opção do compilador que você escolher (multithread, DLL, / CLR).Se você incluir o Arquivos Cabeçalho Biblioteca C++ Padrão no seu código, uma biblioteca C++ padrão será vinculada na automaticamente por Visual C++ no momento da compilar. Por exemplo:
#include <ios>
Qual é a diferença entre msvcrt.dll e msvcr90.dll?
O msvcrt.dll agora é uma "DLL conhecida", que significa que é um componente do sistema de propriedade e criados pelo Windows.Ele é destinado ao uso futuro somente por componentes de sistema.
Quais problemas existem se um aplicativo usa msvcrt.dll e msvcr90.dll?
Se você tiver um arquivo .lib ou .obj que necessita para vincular a msvcrt.lib, em seguida, você não deverá recompilar para funcionar com o novo msvcrt.lib em Visual C++ 2008. O arquivo .lib ou .obj pode contar com o tamanho, 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 de forma compatível.Quando você revincular contra msvcrt.lib, a imagem final EXE e DLL agora terão uma dependência em msvcr90.dll em vez de msvcrt.dll.
Se você tiver mais de uma DLL ou EXE, talvez estejam mais de um CRT, se você estiver usando versões diferentes de ou nãoVisual C++. Por exemplo, vincular estaticamente a CRT em várias DLLs pode apresentar o mesmo problema.Os desenvolvedores enfrentando esse problema com CRTs estático for instruído para proceder assim compilar com /MD usar a DLL do CRT.Agora que a DLL do CRT foi renomeada para msvcr90.dll, aplicativos podem ter alguns componentes vinculados msvcrt.dll e outras pessoas para msvcr90.dll.Se suas DLLs passam CRT recursos por limite msvcrt.dll e msvcr90.dll, você irá encontrar problemas com CRTs incompatíveis e precisar recompilar o projeto com Visual C++ 2008.
Se seu programa está usando mais de uma versão do CRT, alguns cuidados é necessária ao transmitir determinados objetos de CRT (sistema autônomo identificadores de arquivo, localidades e variáveis de ambiente) através de limites DLL.Para obter mais informações sobre os problemas envolvidos e como resolvê-las, consulte Erros potenciais passar objetos CRT em limites DLL.
Bibliotecas padrão em WinSxS cache de assembly global
In Visual C++ 2008, as bibliotecas de tempo de execução C e C++ (ex.: msvcm90.dll, msvcm90d.dll) são armazenados no cache global de assemblies.