Предупреждение средств компоновщика 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
(Использование предварительно скомпилированного файла заголовка).