Pergunta

Ao construir projetos em C++, descobri que a depuração de erros de vinculação é complicada, especialmente ao coletar o código de outras pessoas.Quais estratégias as pessoas usam para depurar e corrigir erros de vinculação?

Foi útil?

Solução

Não tenho certeza de qual é o seu nível de conhecimento, mas aqui estão os princípios básicos.

Abaixo está um erro de linker do VS 2005 - sim, é uma bagunça gigante se você não estiver familiarizado com ele.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

Existem alguns pontos para focar:

  • "ByteComparator.obj" - Procure um arquivo ByteComparator.cpp, esta é a origem do problema do vinculador
  • "int __cdecl does_not_exist(void)" - Este é o símbolo que não foi encontrado, neste caso uma função chamada does_not_exist()

Neste ponto, em muitos casos, o caminho mais rápido para a resolução é pesquisar a base de código desta função e descobrir onde está a implementação.Depois de saber onde a função está implementada, você só precisa garantir que os dois locais estejam interligados.

Se estiver usando o VS2005, você usaria o menu do botão direito "Dependências do projeto...".Se você estiver usando o gcc, procure em seus makefiles a etapa de geração do executável (gcc chamado com vários arquivos .o) e adicione o arquivo .o ausente.


Em um segundo cenário, pode estar faltando uma dependência "externa", para a qual você não possui código.As bibliotecas Win32 são frequentemente implementadas em bibliotecas estáticas às quais você precisa vincular.Neste caso, vá para MSDN ou "MicrosoftGoogle" e pesquise a API.Na parte inferior da descrição da API é fornecido o nome da biblioteca.Adicione isso à lista "Propriedades de configuração-> Vinculador-> Entrada-> Dependências adicionais" das propriedades do seu projeto.Por exemplo, a função timeGetTime() página no MSDN diz para você usar Winmm.lib na parte inferior da página.

Outras dicas

As bibliotecas de tempo de execução C costumam ser as maiores culpadas.Certificando-se de que todos os seus projetos tenham as mesmas configurações de single vs multi-threading e static vs dll.

A documentação do MSDN é boa para apontar qual biblioteca uma chamada de API Win32 específica requer se estiver faltando.

Fora isso, geralmente se resume a ativar o sinalizador detalhado e percorrer a saída em busca de pistas.

Um dos erros comuns de vinculação que encontrei é quando uma função é usada de maneira diferente de como foi definida.Se você vir esse erro, certifique-se de que todas as funções usadas estejam declaradas corretamente em algum arquivo .h.
Você também deve certificar-se de que todos os arquivos de origem relevantes sejam compilados no mesmo arquivo lib.Um erro que encontrei é quando tenho dois conjuntos de arquivos compilados em duas bibliotecas separadas e faço chamadas cruzadas entre bibliotecas.

Existe uma falha que você tem em mente?

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