Partilhar via


Aviso de ferramentas de vinculação LNK4221

Esse arquivo de objeto não define nenhum símbolo público indefinido anteriormente, portanto, não será usado por nenhuma operação de link que consuma essa biblioteca

Example

Considere os dois trechos de código a seguir, a.cpp:

// a.cpp
#include <atlbase.h>

E b.cpp:

// b.cpp
#include <atlbase.h>
int function()
{
   return 0;
}

Para compilar os arquivos e criar dois arquivos de objeto, execute cl /c a.cpp b.cpp em um prompt de comando. Se ligar os ficheiros de objeto executando link /lib /out:test.lib a.obj b.obj, receberá o aviso LNK4221. Se vinculares os objetos executando link /lib /out:test.lib b.obj a.obj, não receberás um aviso.

Nenhum aviso é emitido no segundo cenário porque o vinculador opera de maneira last-in-first-out (LIFO). No primeiro cenário, b.obj é processado antes a.obje a.obj não tem novos símbolos para adicionar. Ao instruir o vinculador a processar a.obj primeiro, você pode evitar o aviso.

Uma causa comum desse erro é quando dois arquivos de origem especificam a opção /Yc (Criar arquivo de cabeçalho pré-compilado) com o mesmo nome de arquivo de cabeçalho especificado no campo Cabeçalho pré-compilado . Uma causa comum desse problema ocorre com pch.h porque, por padrão, pch.cpp inclui pch.h e não adiciona quaisquer novos símbolos. Se outro arquivo de origem incluir pch.h com /Yc, e o arquivo associado .obj for processado antes de pch.obj, o vinculador lançará LNK4221.

Uma causa comum desse erro é quando dois arquivos de origem especificam a opção /Yc (Criar arquivo de cabeçalho pré-compilado) com o mesmo nome de arquivo de cabeçalho especificado no campo Cabeçalho pré-compilado . Uma causa comum desse problema está relacionada com stdafx.h , já que, por padrão, stdafx.cpp abrange stdafx.h e não adiciona novos símbolos. Se outro arquivo de origem incluir stdafx.h com /Yc e o arquivo associado .obj for processado antes de stdafx.obj, o vinculador lançará LNK4221.

Uma maneira de resolver este problema é certificar-se de que, para cada cabeçalho pré-compilado, há apenas um ficheiro de origem que o inclui com /Yc. Todos os outros arquivos de origem devem usar cabeçalhos pré-compilados. Para obter mais informações sobre como alterar essa configuração, consulte /Yu (Usar arquivo de cabeçalho pré-compilado).