Как устранить предупреждение 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 не определяет никаких новых функций или не имеет пустых тел для функций конструктора, вы получите это предупреждение. Я использовал список инициализации для моего конструктора, чтобы тело было пустым.