AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79324205
Accepted
Thomas Weller
Thomas Weller
Asked: 2025-01-02 23:23:20 +0800 CST2025-01-02 23:23:20 +0800 CST 2025-01-02 23:23:20 +0800 CST

Onde definir a opção /LD ao usar o compilador MSVC?

  • 772

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:

  1. 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.
  2. Selecione a página de propriedades Propriedades de configuração > C/C++ > Geração de código.
  3. 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)".

Tipo de projeto 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 /LDas opções de linha de comando adicionais da IU. Mas eu quero entender melhor e não apenas seguir algumas instruções às cegas.

c++
  • 2 2 respostas
  • 132 Views

2 respostas

  • Voted
  1. Best Answer
    Euro Micelli
    2025-01-03T12:16:32+08:002025-01-03T12:16:32+08:00

    O atual compilador de linha de comando C/C++ da Microsoft (CL.EXE) suporta /LDperfeitamente:

    C:\>CL.EXE -?
    Microsoft (R) C/C++ Optimizing Compiler Version 19.42.34435 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
                         C/C++ COMPILER OPTIONS
    ...
                                -LINKING-
    
    /LD Create .DLL                         /LDd Create .DLL debug library
    /LN Create a .netmodule                 /F<num> set stack size
    /link [linker options and libraries]    /MD link with MSVCRT.LIB
    /MT link with LIBCMT.LIB                /MDd link with MSVCRTD.LIB debug lib
    /MTd link with LIBCMTD.LIB debug lib
    ...
    

    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 /cargumento (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 /cporque 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 /LDsinalizador na caixa de diálogo Configuração do Projeto do Visual Studio porque a opção não faz nada se você passar o /cargumento (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 /dllargumento 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 /LDe /LDdsã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.

    • 4
  2. Zhenning Zhang
    2025-01-03T15:32:31+08:002025-01-03T15:32:31+08:00

    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.

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

    ================================================ ======================

    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.

    insira a descrição da imagem aqui

    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.

    insira a descrição da imagem aqui

    • 2

relate perguntas

  • Por que os compiladores perdem a vetorização aqui?

  • Erro de compilação usando CMake com biblioteca [fechada]

  • Erro lançado toda vez que tento executar o premake

  • Como criar um tipo de octeto semelhante a std::byte em C++?

  • Somente operações bit a bit para std::byte em C++ 17?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve