Предупреждение LNK4075, когда проект C++/CLI ссылается на проект статической библиотеки с параметром /ZI (редактировать и продолжить)

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

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

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

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

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

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

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

Я понимаю, что не смогу использовать команду "Изменить и продолжить" в проекте C++/CLI, так как это не поддерживается. Действительно, изменение /ZI на /Zi (отключение функции «Редактировать и продолжить») в проекте статической библиотеки устраняет предупреждение, но я не могу этого сделать — другим потребителям этой библиотеки, не использующим CLR, необходимо использовать команду «Редактировать и продолжить».

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

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


person Yodan Tauber    schedule 23.02.2014    source источник


Ответы (3)


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

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

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

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

person Hans Passant    schedule 23.02.2014
comment
Я искал параметр, в котором я мог бы установить /OPT:NOLBR с помощью раскрывающегося списка в VisualStudio. Однако для этого нет элемента пользовательского интерфейса. Вы должны добавить это как Дополнительный вариант в разделе Configuration Properties -> Linker -> Command Line. - person eckes; 01.02.2016

Другого пути нет

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

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

person Jochen Kalmbach    schedule 23.02.2014

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

person Alfred    schedule 28.11.2014