Compartilhar via


Aviso das ferramentas de vinculador LNK4221

Este objeto não define nenhum dos símbolos anteriormente indefinidos. Portanto, ele não será utilizado em operações de vínculo que consumam esta biblioteca

Considere os dois seguintes snippets de código, 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 você vincular os arquivos de objeto executando link /lib /out:test.lib a.obj b.obj, receberá o aviso LNK4221. Se você vincular os objetos executando link /lib /out:test.lib b.obj a.obj, não receberá um aviso.

Nenhum aviso é emitido no segundo cenário porque o vinculador opera de maneira UEPS (último a entrar, primeiro a sair). No primeiro cenário, b.obj é processado antes a.obj e a.obj não tem novos símbolos a serem adicionados. 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 lida com pch.h pois, por padrão, pch.cpp inclui pch.h e não adiciona novos símbolos. Se outro arquivo de origem incluir pch.h com /Yc e o arquivo .obj associado 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 lida com stdafx.h pois, por padrão, stdafx.cpp inclui stdafx.h e não adiciona novos símbolos. Se outro arquivo de origem incluir stdafx.h com /Yc e o arquivo .obj associado for processado antes de stdafx.obj, o vinculador lançará LNK4221.

Uma maneira de resolver esse problema é garantir que, para cada cabeçalho pré-compilado, haja apenas um arquivo de origem que o inclua 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, confira /Yu (usar arquivo de cabeçalho pré-compilado).