Предупреждение 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, который вызвал проблемы.