No Visual Studio, há os sinalizadores de compilação / MD e / MT que permitem escolher o tipo de biblioteca de tempo de execução C que você deseja.
Entendo a diferença na implementação, mas ainda não tenho certeza de qual usar. Quais são os prós / contras?
Uma vantagem do / MD que ouvi foi que isso permite que alguém atualize o tempo de execução (como talvez corrigir um problema de segurança) e meu aplicativo se beneficiará dessa atualização. Embora, para mim, isso quase pareça um recurso não: eu não quero que as pessoas mudem meu tempo de execução sem me permitir testar a nova versão!
Estou curioso sobre algumas coisas:
- Como isso afetaria os tempos de construção? (presumivelmente / MT é um pouco mais lento?)
- Quais são as outras implicações?
- Qual deles a maioria das pessoas usa?
Respostas:
Ao vincular dinamicamente com / MD,
Também descobri que, na prática, ao trabalhar com bibliotecas binárias de terceiros vinculadas estaticamente que foram criadas com diferentes opções de tempo de execução, o / MT no aplicativo principal tende a causar conflitos com muito mais frequência do que o / MD (porque você terá problemas se o tempo de execução C estiver estaticamente vinculado várias vezes, especialmente se forem versões diferentes).
fonte
/MT
será um pouco mais rápido em tempo de execução, já que seu aplicativo não precisa procurar a implementação da função de tempo de execução todas as vezes, não sou especialista nesse nível, mas tenho quase certeza de que Os SOs armazenam em cache as implementações de tempo de execução para que seu aplicativo use a versão em cache, portanto a diferença não será tão longe. NOTA: mencionei que não tenho certeza, portanto, não tome esse comentário como argumento.Se você estiver usando DLLs, deverá procurar o CRT vinculado dinamicamente (/ MD).
Se você usar o CRT dinâmico para o seu .exe e todos os .dlls, todos compartilharão uma única implementação do CRT - o que significa que todos compartilharão um único heap e a memória do CRT alocada em um .exe / .dll. outro.
Se você usar o CRT estático para o seu .exe e todos os .dlls, todos receberão uma cópia separada do CRT - o que significa que todos usarão seu próprio heap de CRT para que a memória seja liberada no mesmo módulo em que foi alocado. Você também sofrerá com o inchaço do código (várias cópias do CRT) e a sobrecarga excessiva do tempo de execução (cada pilha aloca memória do sistema operacional para acompanhar seu estado, e a sobrecarga pode ser notada).
fonte
Eu acredito que o padrão para projetos criados através do Visual Studio é / MD.
Se você usar / MT, seu executável não dependerá da presença de uma DLL no sistema de destino. Se você estiver agrupando isso em um instalador, provavelmente não será um problema e você pode ir de qualquer maneira.
Eu mesmo uso o / MT, para poder ignorar toda a bagunça da DLL.
PS Como observa o Sr. Fooz , é vital ser consistente. Se você estiver vinculando com outras bibliotecas, precisará usar a mesma opção que elas. Se você estiver usando uma DLL de terceiros, é quase certo que você precisará usar a versão DLL da biblioteca de tempo de execução.
fonte
Eu prefiro vincular estaticamente com / MT.
Mesmo que você obtenha um executável menor com / MD, você ainda precisará enviar um monte de DLLs para garantir que o usuário obtenha a versão correta para executar seu programa. E, no final, seu instalador será MAIOR do que ao vincular com / MT.
O que é ainda pior: se você optar por colocar suas bibliotecas de tempo de execução no diretório do Windows, mais cedo ou mais tarde o usuário instalará um novo aplicativo com diferentes bibliotecas e, com alguma má sorte, interromperá seu aplicativo.
fonte
O problema que você encontrará com / MD é que a versão de destino do CRT pode não estar na máquina dos usuários (especialmente se você estiver usando a versão mais recente do Visual Studio e o usuário tiver um sistema operacional mais antigo).
Nesse caso, você precisa descobrir como obter a versão correta na máquina deles.
fonte
de http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
Portanto, se eu estiver interpretando corretamente, os links / MT estaticamente e / MD serão dinamicamente.
fonte
Se você estiver criando um executável que use outras DLLs ou bibliotecas que não a opção / MD, é preferível, pois dessa forma todos os componentes compartilharão a mesma biblioteca. Obviamente, esta opção deve corresponder a todos os módulos envolvidos, isto é, dll / lib / exe.
Se o seu executável não usa nenhuma lib ou dll do que a chamada de ninguém. A diferença não é grande agora, porque o aspecto de compartilhamento não está em jogo.
Então, talvez você possa iniciar o aplicativo com / MT, já que não há um motivo convincente, mas quando é hora de adicionar uma lib ou dll, você pode alterá-lo para / MD com o da lib / dll, o que é fácil.
fonte