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

Символ "символ", определенный в файлеname.obj, импортируется

__declspec(dllimport) был указан для символа , даже если символ определен в файле объекта filename.obj в том же изображении. Удалите модификатор, __declspec(dllimport) чтобы устранить это предупреждение.

Замечания

Это предупреждение создается компоновщиком при определении символа в одном файле объекта и ссылке на него с помощью __declspec(dllimport) модификатора объявления в другом.

Предупреждение LNK4049 — это более общая версия предупреждений средств компоновщика LNK4217. Компоновщик создает предупреждение LNK4049, если он не может определить, какой файл функции или объекта ссылается на импортированный символ.

Распространенные случаи создания LNK4049 вместо LNK4217:

Чтобы устранить LNK4049, попробуйте выполнить одну из следующих процедур:

  • __declspec(dllimport) Удалите модификатор из объявления вперед символа, который активировал LNK4049. Вы можете искать символы в двоичном изображении с помощью служебной программы DUMPBIN . Переключатель DUMPBIN /SY МБ OLS отображает таблицу символов COFF изображения. Дополнительные сведения о служебной программе DUMPBIN см. в справочнике по DUMPBIN.

  • Временно отключите добавочную компоновку и оптимизацию всей программы. При повторной компиляции приложение создает предупреждение LNK4217, включающее имя функции, которая ссылается на импортированный символ. __declspec(dllimport) Удалите модификатор объявления из импортированного символа и повторно включите добавочную компоновку или оптимизацию всей программы по мере необходимости.

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

Дополнительные сведения о объявлениях импорта и экспорта данных см . в dllexport, dllimport.

Пример

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

// LNK4049a.cpp
// compile with: /c

__declspec(dllexport) int func()
{
   return 3;
}

Второй модуль создает файл объекта, содержащий объявление пересылки функции, экспортируемой в первом модуле, а также вызов этой функции внутри main функции. Связывание этого модуля с первым модулем создаст LNK4049. __declspec(dllimport) Удалите модификатор из объявления, чтобы устранить предупреждение.

// LNK4049b.cpp
// compile with: /link /WX /LTCG LNK4049a.obj
// LNK4049 expected

__declspec(dllimport) int func();
// try the following line instead
// int func();

int main()
{
   return func();
}

См. также

Предупреждение средств компоновщика LNK4217
Предупреждение средств компоновщика LNK4286
dllexport, dllimport