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:
Ao usar a opção /INCREMENTAL.
Ao usar a opção /LTCG.
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