Pergunta

No Visual Studio, há o sinalizadores de compilação / MD e / MT, que permitem que você escolha que tipo de C biblioteca de tempo de execução que você deseja.

Eu entendo a diferença na implementação, mas eu ainda não tenho certeza de qual usar. Quais são as vantagens / desvantagens?

Uma vantagem para / MD que eu ouvi, é que isso permite que alguém para atualizar o tempo de execução, (como talvez corrigir um problema de segurança) e meu aplicativo irá beneficiar desta actualização. Embora para mim, isso parece quase como um não-recurso: Eu não quero que as pessoas mudando meu tempo de execução sem me permitir teste contra a nova versão

!

Algumas coisas que eu estou curioso sobre: ??

  • Como isso afetaria o tempo de construção? (Presumivelmente / MT é um pouco mais lento?)
  • Quais são as outras implicações?
  • Qual deles mais as pessoas usam?
Foi útil?

Solução

Ao vincular dinamicamente com / MD,

  • você está exposto a atualizações do sistema (bem ou mal),
  • seu executável pode ser menor (uma vez que não têm a biblioteca embutida nele), e
  • Eu acredito que pelo menos o segmento de código de uma DLL é compartilhado entre todos os processos que estão usando ativamente (reduzindo a quantidade total de RAM consumida).

Eu também descobri que, na prática, ao trabalhar com bibliotecas somente binários 3-parte estaticamente ligadas que foram construídos com diferentes opções de tempo de execução, / MT na aplicação principal tende a causar conflitos com muito mais frequência do que o / MD (porque você vai ter problemas se o tempo de execução C estaticamente ligado várias vezes, especialmente se eles são versões diferentes).

Outras dicas

Se você estiver usando DLLs então você deve ir para o CRT ligados dinamicamente (/ MD).

Se você usar a CRT dinâmica para o seu .exe e todas as DLLs em seguida, eles irão compartilhar uma única implementação do CRT - o que significa que eles vão todos compartilham uma única pilha CRT e memória alocada em um .exe / .dll pode ser libertado em outra.

Se você usar a CRT estático para o .exe e todas as DLLs em seguida, todos eles obter uma cópia em separado do CRT - o que significa que tudo vai usar a sua própria pilha CRT modo memória deve ser liberada no mesmo módulo em que foi alocado. Você também vai sofrer de inchaço de código (várias cópias do CRT) e excesso de sobrecarga de tempo de execução (cada Aloca memória heap do sistema operacional para manter o controle de seu estado, e a sobrecarga pode ser notada).

Eu acredito que o padrão para projetos construídos por meio do Visual Studio é / MD.

Se você usar / MT, o executável não vai depender de uma DLL estar presente no sistema de destino. Se você está enrolando isso em um instalador, ele provavelmente não vai ser um problema e você pode ir de qualquer maneira.

Eu uso / MT mim mesmo, para que eu possa ignorar toda a DLL bagunça.

P.S. Como Fooz pontos fora, é vital para ser consistente. Se você está ligando com outras bibliotecas, você precisará usar a mesma opção que eles fazem. Se você estiver usando uma terceira DLL partido, é quase certo que você vai precisar usar a versão DLL da biblioteca de tempo de execução.

Eu prefiro ligação estaticamente com / MT.

Mesmo que você receber um executável menor com / MD, você ainda tem que enviar um monte de DLLs para garantir que o usuário recebe a versão da direita para a execução de seu programa. E no final o seu instalador vai ser maior do que quando a vinculação com / MT.

O que é ainda pior, se você optar por colocar as suas bibliotecas de execução no diretório do Windows, mais cedo ou mais tarde, o usuário vai instalar uma nova aplicação com diferentes bibliotecas e, com alguma má sorte, quebrar a sua aplicação.

O problema que você vai correr em com / MD é que a versão de destino do CRT pode não ser em sua máquina usuários (especialmente se você estiver usando a versão mais recente do Visual Studio eo usuário tem um sistema operacional mais antigo).

Nesse caso, você tem que descobrir como obter a versão à direita para a sua máquina.

http://msdn.microsoft.com/ en-us / library / 2kzt1wy3 (VS.71) .aspx :

/ MT Define _MT de modo que as versões específicas do multithread das rotinas de tempo de execução são selecionadas a partir dos arquivos padrão de cabeçalho (.h). Esta opção também faz com que o compilador para colocar o nome da biblioteca LIBCMT.lib no arquivo .obj para que o vinculador irá usar LIBCMT.lib para resolver símbolos externos. Either / MT ou / MD (ou seus equivalentes de depuração / MTd ou / MDD) é necessário para criar programas multithread.

/ MD Define _MT e _DLL de modo que ambas as versões multithread- e específicos de DLL das rotinas de tempo de execução são selecionadas a partir dos arquivos .h padrão. Esta opção também faz com que o compilador para colocar o nome da biblioteca MSVCRT.lib no arquivo .obj.

aplicativos compilados com esta opção são estaticamente ligado ao MSVCRT.lib. Esta biblioteca fornece uma camada de código que permite que o vinculador para resolver referências externas. O código de trabalho real está contido em MSVCR71.DLL, que deve estar disponível em tempo de execução para aplicações ligadas com MSVCRT.lib.

Quando / MD é utilizado com _STATIC_CPPLIB definido (/ D_STATIC_CPPLIB) fará com que o aplicativo para ligação com a estática multithread Biblioteca C ++ Padrão (libcpmt.lib) em vez da versão dinâmica (MSVCPRT.lib) enquanto ainda ligar dinamicamente ao principal CRT via msvcrt.lib.

Então, se eu estou interpretando-a corretamente, então / MT links de estática e / MD ligações dinamicamente.

Se você está construindo executável que usa outras DLLs ou libs opção / MD que é o preferido, porque dessa forma todos os componentes estarão compartilhando mesma biblioteca. É claro que esta opção deve corresponder para todos os módulos envolvidos ou seja dll / lib / exe.

Se o seu executável não usa qualquer lib ou dll do que o chamado de seu ninguém. A diferença não é muito agora porque o aspecto partilha não está em jogo.

Então, talvez você pode iniciar o aplicativo com / MT já que não há razão convincente de outra forma, mas quando é hora de adicionar um lib ou DLL, você pode alterá-lo para / MD com a do lib / dll que é fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top