Estou tentando entender a opção "Biblioteca de Tempo de Execução" do Microsoft Visual Studio C++.
De acordo com /MD, /MT, /LD (Use Run-Time Library) [MS Learn] , há 6 opções. Essas são essencialmente 3 opções que vêm em Debug e Release flavor.
Onde defino a opção /LD?
O site diz:
- Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir propriedades de compilação e compilação do C++ no Visual Studio.
- Selecione a página de propriedades Propriedades de configuração > C/C++ > Geração de código.
- Modifique a propriedade Biblioteca de Tempo de Execução.
Nesse lugar, meu Visual Studio só oferece /MD, /MT, /MDd e /MTd. Não há opção /LD ou /LDd disponível.
Desta declaração em /LD:
Implica /MT, a menos que você especifique explicitamente /MD.
Concluo que essas devem ser opções diferentes, caso contrário eu não poderia especificar /LD e /MD ao mesmo tempo.
Estou usando o Visual Studio 2022 Preview, versão 17.13.0 Preview 2.1. Meu tipo de projeto é uma "Biblioteca de vínculo dinâmico (DLL)". Propriedades de configuração / Geral / Tipo de configuração diz "Biblioteca dinâmica (.dll)".
Estes são todos os argumentos da linha de comando do compilador se eu especificar /MT para a configuração de depuração:
/JMC /permissive- /Yu"pch.h" /ifcOutput "x64\Debug\" /GS /W3 /Zc:wchar_t
/ZI /Gm- /Od /sdl /Fd"x64\Debug\vc143.pdb" /Zc:inline /fp:precise
/D "_DEBUG" /D "DYNAMICLIBRARY_EXPORTS" /D "_WINDOWS" /D "_USRDLL" /D "_WINDLL"
/D "_UNICODE" /D "UNICODE"
/errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MT /FC /Fa"x64\Debug\" /EHsc
/nologo /Fo"x64\Debug\" /Fp"x64\Debug\DynamicLibrary.pch" /diagnostics:column
Por quê? Este exemplo [MSDN] diz que eu deveria compilar usando cl /EHsc /W4 /MD /LD test1Dll.cpp
. Eu sei, eu poderia fazer isso na linha de comando ou adicionar /LD
as opções de linha de comando adicionais da IU. Mas eu quero entender melhor e não apenas seguir algumas instruções às cegas.
O atual compilador de linha de comando C/C++ da Microsoft (CL.EXE) suporta
/LD
perfeitamente:Se você usa apenas o Visual Studio, talvez não saiba que o compilador de linha de comando CL.EXE chama automaticamente o vinculador (LINK.EXE) após a compilação, para que você possa obter o produto final em um comando. Ou seja, a menos que você passe o
/c
argumento (em letras minúsculas) para o CL.EXE, "compile only, no link", que diz ao compilador para agir como um compilador puro e deixar o vinculador de fora. E embora fazer com que o compilador chame o vinculador para você possa ser conveniente para programas pequenos, o Visual Studio SEMPRE passa/c
porque ele quer a máxima flexibilidade controlando o compilador e o vinculador independentemente.As opções
/LD
(e/LDd
) do compilador existem para dar suporte a pessoas que usam CL.EXE em seu modo compilador+link padrão, manualmente ou de um arquivo batch ou um arquivo make. Elas dizem ao compilador para dizer ao linker para fazer uma DLL.Você não verá uma opção para definir um
/LD
sinalizador na caixa de diálogo Configuração do Projeto do Visual Studio porque a opção não faz nada se você passar o/c
argumento (o que é sempre o caso no Visual Studio). Quando você seleciona "Biblioteca Dinâmica (.dll)" na opção "Tipo de Configuração", o Visual Studio passa o/dll
argumento diretamente para o vinculador quando ele o chama mais tarde.Tenha em mente que a documentação online que você referencia é para as opções de linha de comando CL.EXE. Ela foi escrita com um usuário de linha de comando em mente, não o Visual Studio. E embora essas opções tenham uma correlação estreita com as opções em um projeto do Visual Studio, elas não são uma correspondência exata de 100%.
Finalmente, a razão pela qual
/LD
e/LDd
são agrupados na documentação com/MT
,/MTd
, etc. não é porque tem algo a ver com a depuração ou lançamento ou versão single-vs-multithreaded das bibliotecas C-Runtime etc. Ou "Use Runtime Library" para esse assunto, como o título da documentação online sugere. Eles são agrupados porque esses sinalizadores são para o vinculador , não para o compilador. Sim, o título da documentação online atual é um pouco enganoso, provavelmente atualizado por alguém focado no que a maioria das opções faz e perdendo de vista o motivo pelo qual as opções foram agrupadas para começar.Nos meus testes, de fato,
/MT e /MD são opções de configuração para as configurações da biblioteca de tempo de execução.
/MD indica que a biblioteca de tempo de execução é fornecida pelo sistema operacional como uma DLL e não está incorporada no programa. Como resultado, o arquivo compilado é menor. A biblioteca usada é MSVCRT.lib. /MT indica que a biblioteca de tempo de execução está incorporada no programa. Isso resulta em um arquivo compilado maior. A biblioteca usada é LIBCMT.lib.
/LD é usado para controlar o tipo de saída como uma DLL e não está relacionado à biblioteca de tempo de execução.
/MT ou /MD podem ser usados junto com /LD.
================================================ ======================
Como /LD é usado para controlar o tipo de saída como uma DLL e não está relacionado à biblioteca de tempo de execução, é razoável que essa opção não esteja disponível abaixo.
Acredito que o uso de /LD deveria ser mais implícito, o que significa que quando você escolhe criar um projeto DLL, o compilador deve definir automaticamente /LD durante a compilação.