Предупреждение средств компоновщика LNK4221

Этот файл объекта не определяет ранее неопределенные открытые символы, поэтому он не будет использоваться любой операцией связывания, используюющей эту библиотеку.

Рассмотрим следующие два фрагмента кода: a.cpp

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

И b.cpp:

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

Чтобы скомпилировать файлы и создать два файла объектов, выполните команду cl /c a.cpp b.cpp в командной строке. При связывании файлов объектов с помощью запуска link /lib /out:test.lib a.obj b.objвы получите предупреждение LNK4221. При связывании объектов с помощью запуска link /lib /out:test.lib b.obj a.objвы не получите предупреждение.

Предупреждение не выводится во втором сценарии, так как компоновщик работает в режиме последнего выхода (LIFO). В первом сценарии b.obj обрабатывается раньше a.objи a.obj не имеет новых символов для добавления. Поручив компоновщику сначала обработать a.obj предупреждение, можно избежать предупреждения.

Распространенная причина этой ошибки заключается в том, что два исходных файла указывают параметр /Yc (Create Precompiled Header File) с тем же именем файла заголовка, указанным в поле предварительно скомпилированного заголовка . Распространенная причина этой проблемы связана с pch.h тем, что по умолчанию pch.cpp включает pch.h и не добавляет новые символы. Если другой исходный файл включает в /Yc себя pch.h и связанный .obj файл обрабатывается раньшеpch.obj, компоновщик будет вызывать LNK4221.

Распространенная причина этой ошибки заключается в том, что два исходных файла указывают параметр /Yc (Create Precompiled Header File) с тем же именем файла заголовка, указанным в поле предварительно скомпилированного заголовка . Распространенная причина этой проблемы связана с stdafx.h тем, что по умолчанию stdafx.cpp включает stdafx.h и не добавляет новые символы. Если другой исходный файл включает в /Yc себя stdafx.h и связанный .obj файл обрабатывается раньшеstdafx.obj, компоновщик будет вызывать LNK4221.

Один из способов устранить эту проблему заключается в том, чтобы убедиться, что для каждого предварительно скомпилированного заголовка существует только один исходный файл, содержащий его /Yc. Все остальные исходные файлы должны использовать предварительно скомпилированные заголовки. Дополнительные сведения об изменении этого параметра см. в разделе /Yu (Использование предварительно скомпилированного файла заголовка).