Partilhar via


Ferramentas de vinculação LNK4049 de aviso

o símbolo «símbolo» definido em «filename.obj» é importado

Observações

__declspec(dllimport) foi especificado para o símbolo mesmo que o símbolo é definido no arquivo de objeto filename.obj na mesma imagem. Remova o __declspec(dllimport) modificador para resolver este aviso.

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 __declspec(dllimport) declaração em outro.

Warning LNK4049 é uma versão mais geral do Linker Tools Warning LNK4217. O vinculador gera o aviso LNK4049 quando não consegue 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, tente um dos seguintes procedimentos:

  • Remova o __declspec(dllimport) modificador da declaração antecipada do símbolo que disparou LNK4049. Você pode procurar símbolos dentro de 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 , consulte Referência DUMPBIN.

  • Desative temporariamente a vinculação incremental e a otimização de todo o programa. Quando recompilada, a aplicação 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 ative novamente a ligação incremental ou a otimização de todo o programa, 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. Este aviso não aparece quando você compila usando a opção /clr .

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

Example

Vincular os dois módulos a seguir gerará LNK4049. O primeiro módulo gera um arquivo de objeto contendo uma única função exportada.

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

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

O segundo módulo gera um arquivo de objeto contendo uma declaração de encaminhamento para a função exportada no primeiro módulo, juntamente com uma chamada para esta função dentro da main função. Ligar este módulo com o primeiro módulo irá gerar LNK4049. Remova o __declspec(dllimport) modificador 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();
}

Consulte também

Aviso das ferramentas de ligação LNK4217
Aviso de ferramentas de vinculação LNK4286
dllexport, dllimport