Поделиться через


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