Предупреждение LNK4075, когда проект С++/CLI ссылается на статический проект lib с /ZI (Edit And Continue)

У меня есть следующие проекты в решении Visual Studio 2012:

  • Native (no /clr) static lib project, скомпилированный с /ZI для редактирования и продолжения.
  • Проект С++/CLI DLL, который ссылается на вышеуказанный статический lib.

Проект С++/CLI строится со следующим предупреждением:

warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:LBR' specification

Если/OPT: NOLBR добавляется в параметры компоновщика проекта С++/CLI, предупреждение становится:

warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification

Любая попытка изменить настройку инкрементной привязки проекта С++/CLI не изменяет предупреждение (проекты С++/CLI никогда не связывают инкрементально).

Я понимаю, что я не смогу использовать Edit And Continue в проекте С++/CLI, потому что это не поддерживается. Действительно, изменение /ZI to/Zi (отключение Edit And Continue) в статическом проекте lib исключает предупреждение, но я не могу этого сделать - другим пользователям, не являющимся CLR этого lib, необходимо использовать Edit And Continue.

Как я могу избавиться от этого предупреждения, не отключая Edit And Continue в статическом lib (и, надеюсь, не поддерживая отдельную конфигурацию сборки для собственных и CLR-пользователей статического lib)? Я имею в виду, есть ли способ попросить компоновщика игнорировать директиву /EDITANDCONTINUE, встроенную в статическую lib, указанную в ссылке (почти так же, как /NODEFAULTLIB может игнорировать директивы /DEFAULTLIB)?

Я создал минимальное решение VS, которое воспроизводит описанную проблему.

Ответы

Ответ 1

из-за спецификации "/OPT: LBR"

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

Это достаточно точно, хотя и не выигрывает никаких призов. Вы запросили поддержку Edit + Continue в своем статическом проекте lib, но это недоступно для сборки в смешанном режиме .NET. Функция недокументированного/IGNORE-линкера доступна для подавления предупреждающих сообщений, но Chorell занимает "неузнаваемое предупреждение" .

Вам придется жить с этим предупреждением, если вы не хотите менять свой статический проект lib. Это абсолютно доброкачественный. Вы не получите его, когда перекомпилируете его с помощью/Zi.

Ответ 2

Нет другого пути к

  • отключить "Редактировать и продолжить" в LIB
  • создать конфигурацию сборки разделителя для "Редактировать и продолжить (/ZI)" и "База данных программ (/Zi)"

Конечно: я не знаю, что существует предопределенный макрос для определения между /ZI и/Zi... поэтому вам нужно определить свой собственный препроцессорный derective, чтобы разделить эти конфигурации...

Ответ 3

У меня была та же проблема, и я нашел единственное решение - удалить файлы .vcxproj и .sln проекта и снова создать проект. Но затем в старой копии того же проекта я нашел лучшее решение: я изменил в файле projectname.vcxproj строку Профиль true в Профиль false и предупреждения LNK4075 исчезли. Это был Visual Studio Profiler, который вызвал проблемы.