Ferramentas de Utilizador

Ferramentas de Site


pt:error_messages

Mensagem de erro - Unresolved external symbol

Essa mensagem é exibida pelo linkeditor (POLINK) quando este não encontra o código objeto referenciado pelo seu programa. Em outras palavras, isso significa que o seu programa tenta chamar uma função, por exemplo, 'my_function', mas o código objeto desta função (um arquivo .obj ou .lib) não foi encontrado e por isso o linkeditor não conseguiu montar o seu programa. Para ilustrar, abra o Pelles C e crie um projeto chamado 'test1' do tipo “Console application wizard” e, terminado o assistente, cole o seguinte código no arquivo main.c:

#include <stdio.h>
void my_function(char *);
 
int main(int argc, char *argv[])
{
    my_function("Hello\n");
    return 0;
}

Se mandarmos o Pelles C compilar esse código, veremos que a compilação é concluída sem problemas (Project → Compile main.c). Mas se quisermos montar o programa, ou seja, gerar o .exe (Project → Build test1.exe), o Pelles C irá mostrar as seguintes mensagens de erro: POLINK: error: Unresolved external symbol '_my_function'. POLINK: fatal error: 1 unresolved external(s).

Por que a compilação é bem sucedida, mas a montagem não? Vamos analisar o programa para encontrar a resposta.

A segunda linha do nosso código, void my_function(char *); diz ao compilador que existe, em algum lugar, uma função chamada my_function que recebe um parâmetro do tipo char* e que não retorna valor algum (void). Mais adiante, é feita uma chamada à função my_function passando o string “Hello\n” como parâmetro. O compilador compila esse código sem apresentar problemas porque não há erros de sintaxe e porque a função my_function é utilizada conforme previsto na declaração, ou seja, envia um string como parâmetro e não espera valor de retorno.

Já para o linkeditor a história é diferente. A tarefa do linkeditor é pegar os códigos objeto e juntá-los de modo a criar um arquivo executável, o nosso .exe. Neste exemplo, nós declaramos o protótipo e realizamos uma chamada à função my_function, mas não implementamos o código dela! Vamos implementar agora. Cole o seguinte código no final do arquivo main.c:

void my_function(char *s)
{
     printf("%s\n", s);
}

Agora o programa está completo. Clique em Project → Build test1.exe. O Pelles C vai mostrar que deu tudo certo:

Building main.obj. Building test1.exe. Done.

Neste nosso exemplo, a solução para o erro 'Unresolved external symbol' foi escrever e compilar a função que estava faltando, mas nem sempre é assim.

Suponha agora que você escreveu um programa utilizando a API do Windows. Como no exemplo anterior, a compilação é realizada com sucesso, mas o linkeditor não consegue gerar o executável e reclama do erro 'Unresolved external symbol 'impShowWindow@8'. Você verifica se não cometeu erro de digitação e conclui que o código foi digitado exatamente como estava no livro e que, portanto, deveria funcionar. Relembrando o exemplo anterior, vimos que podemos declarar uma função simplesmente colocando seu protótipo e o compilador saberá que existe em algum lugar uma determinada função que recebe determinados parâmetros e retorna determinado dado. Neste caso do programa que utiliza a API do Windows, o programa chama a função ShowWindow que sabemos de antemão que faz parte do Windows e não faz sentido escrevermos uma como no exemplo anterior. A solução aqui é adicionar 'user32.lib' à lista de bibliotecas que o linkeditor usará para montar o executável. O caminho para chegar lá é: Project → Options → Linker → Library and object files. Resolvemos o problema e introduzimos outro. Como saber qual lib deveremos adicionar? Para as funções da API do Windows, basta abrir o manual na página que fala da função, assim: abra seu navegador web no endereço http://msdn.microsoft.com/en-us/library e digite o nome da função desejada na caixa de pesquisa, por exemplo “ShowWindow”. Na página de resultados, clique em “ShowWindow Function (Windows)”. Role a página até a seção “Requirements”. Observe que o campo Library contém 'user32.lib', o que procurávamos.

Resumindo, vimos que a mensagem de erro “POLINK: error: Unresolved external symbol '_my_function'” será exibida sempre que o linkeditor não for capaz de encontrar o código-objeto de uma determinada função my_function, seja porque a função foi declarada mas não foi implementada ou porque ficou faltando adicionar a lib correta nas opções do linkeditor de nosso projeto.

pt/error_messages.txt · Esta página foi modificada pela última vez em: 2010/09/05 05:24 por crl