Как устранить предупреждение LNK4221?

Я работаю над проектом с использованием форм С++/windows (visual studio 2010), у нас есть 4 проекта:

  • 1 проект, содержащий окна окон GUI {управляемый код}, и это проект exe
  • другие 3 проекта {неуправляемый код} и все это статические библиотеки.
  • в 4 проектах мы не используем предварительно скомпилированные заголовки stdafx.h, а поддержка общего языка - это поддержка Pure MSIL Common Language Runtime Support (/clr: pure).
  • каждый проект включает в себя другие 3 проекта, в качестве дополнительных включенных каталогов и зависимостей библиотек ссылок, установленных в yes.

Имеем:

Предупреждение LNK4221: этот объектный файл не определяет ранее публичные символы undefined, поэтому он не будет использоваться какой-либо операцией связи, которая потребляет эту библиотеку

Это предупреждение появилось для трех проектов статических библиотек в тех же объектных файлах (.NETFramework, Version = v4.0.AssemblyAttributes.obj).

Мы хотим его устранить, но после некоторого поиска большинство тем говорят о том, что прекомпилированные заголовки являются причиной, в то время как мы не используем его.

Любые новые идеи о том, почему это предупреждение существует и как его устранить?

Ответ 1

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

У этих файлов на самом деле был контент, но он был отключен для визуальной студии, поэтому я просто добавил в начале:

__declspec( dllexport ) void getRidOfLNK4221(){}

И теперь мой проект компилируется без предупреждения:)

Надеюсь, что это поможет, даже если это поздний ответ!

Ответ 2

У меня была статическая библиотека С++ с пустым модулем, связанная с тем, что в неоптимизированном режиме дало мне это предупреждение LNK4221. (в Visual Studio) Я пошел в Librarian- > All Options и добавил "/ignore: 4221" в "Дополнительные параметры". Итак, предупреждение исчезло.

Ответ 3

Вы получаете это предупреждение, потому что используете только классы шаблонов в файле cpp. Чтобы избавиться от него, вставьте одну простую функцию без шаблона.

Ответ 4

Это была всего лишь моя особая проблема, но если ваш .cpp не определяет никаких новых функций или не имеет пустых тел для функций конструктора, вы получите это предупреждение. Я использовал список инициализации для моего конструктора, чтобы тело было пустым.