Compartilhar via


Aviso das ferramentas de vinculador LNK4049

o símbolo 'symbol' definido em 'filename.obj' é importado

__declspec(dllimport) foi especificado para symbol, embora o símbolo seja definido no arquivo de objeto filename_1.obj na mesma imagem. Remova o modificador __declspec(dllimport) para resolver esse aviso.

Comentários

Esse aviso é gerado pelo vinculador quando você define um símbolo em um arquivo de objeto e faz referência a ele usando o modificador de declaração __declspec(dllimport) em outro.

O aviso LNK4049 é uma versão mais geral do Aviso LNK4217 das ferramentas do vinculador. O vinculador gera um aviso LNK4049 quando não pode determinar qual função ou arquivo de objeto referenciou o símbolo importado.

Os casos comuns em que LNK4049 é gerado em vez de LNK4217 são:

Para resolver LNK4049, experimente um dos seguintes procedimentos:

  • Remova o modificador __declspec(dllimport) da declaração de encaminhamento do símbolo que disparou LNK4049. Você pode pesquisar símbolos em uma imagem binária usando o utilitário DUMPBIN. A opção DUMPBIN /SYMBOLS exibe a tabela de símbolos COFF da imagem. Para obter mais informações sobre o utilitário DUMPBIN, confira Referência de DUMPBIN.

  • Desabilite temporariamente a vinculação incremental e a otimização de programa inteiro. Quando recompilado, o aplicativo gera o aviso LNK4217, que inclui o nome da função que faz referência ao símbolo importado. Remova o modificador de declaração __declspec(dllimport) do símbolo importado e habilite novamente a vinculação incremental ou a otimização de programa inteiro, conforme necessário.

Embora o código final gerado se comporte corretamente, o código gerado para chamar a função importada é menos eficiente do que chamar a função diretamente. Esse aviso não aparece quando você compila usando a opção /clr.

Para obter mais informações sobre as declarações de dados de importação e exportação, confira dllexport, dllimport.

Exemplo

A vinculação dos dois módulos a seguir gerará o aviso LNK4049. O primeiro módulo gera um arquivo de objeto que contém apenas uma função exportada.

// LNK4049a.cpp
// compile with: /c

__declspec(dllexport) int func()
{
   return 3;
}

O segundo módulo gera um arquivo de objeto que contém uma declaração de encaminhamento para a função exportada no primeiro módulo, juntamente com uma chamada para essa função dentro da função main. Vincular este módulo com o primeiro módulo gerará o aviso LNK4049. Remova o modificador __declspec(dllimport) da declaração para resolver o aviso.

// LNK4049b.cpp
// compile with: /link /WX /LTCG LNK4049a.obj
// LNK4049 expected

__declspec(dllimport) int func();
// try the following line instead
// int func();

int main()
{
   return func();
}

Confira também

Aviso das ferramentas de vinculador LNK4217
Aviso das ferramentas de vinculador LNK4286
dllexport, dllimport