Visual C++:Как отключить определенные предупреждения компоновщика?

StackOverflow https://stackoverflow.com/questions/661606

Вопрос

Я использую библиотеку из CGAL, которая на этапе компоновки моего кода выдает множество предупреждений о связывании в этой форме:

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

Как мне отключить это конкретное предупреждение компоновщика в Visual C ++ / Studio 2008?

Обратите внимание, что у меня нет никакого контроля над внешней библиотекой (CGAL), которую я использую.Я не могу / не хочу приступать к перекомпиляции внешней библиотеки.Следовательно, необходимо исправить сообщения с моей стороны.

Это было полезно?

Решение

Добавьте следующее в качестве дополнительной опции компоновщика:

 /ignore:4099

Это находится в разделе Свойства-> Компоновщик-> Командная строка

Другие советы

Обновление 2018-10-16

Как сообщается, начиная с 2013 года, это предупреждение может быть отключено.Смотрите комментарий @Mark Ransom.

Оригинальный Ответ

Вы не можете отключить это конкретное предупреждение.

Согласно Джефф Чаппелл предупреждение 4099 обрабатывается так, как будто оно слишком важно, чтобы его игнорировать, даже при использовании в сочетании с / wx (который будет рассматривать предупреждения как ошибки и игнорировать указанное предупреждение в других ситуациях)

Вот соответствующий текст по ссылке:

Не Совсем Унизительные Предупреждения

Для некоторых номеров предупреждений указывается параметр /ignore принимается, но не обязательно выполняется.Если предупреждение появляется пока параметр /wx не активен, предупреждающее сообщение все еще отображается, но если параметр /wx активен, то предупреждение игнорируется.Это как если бы предупреждение считалось достаточно важным, чтобы отменить попытку его игнорирования, но не в том случае, если пользователь назначил слишком высокую цену за незарегистрированные предупреждения.

Это влияет на следующие номера предупреждений:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

(Для протокола и до того, как тема исчезнет на форумах msdn) Вы не можете отключить предупреждение (по крайней мере, в версии VS2010), потому что оно находится в списке предупреждений, которые нельзя отключить (поэтому / wd4099 не будет работать), но вместо этого вы можете сделать исправление link.exe (обычно C:\Program Файлы (x86) \ Microsoft Visual Studio 10.0\VC\bin\link.exe ), чтобы удалить его из указанного списка .Звучит как отбойный молоток, я знаю.Тем не менее, это работает.

Например, если вы хотите удалить предупреждение для 4099, откройте link.exe с помощью шестнадцатеричного редактора перейдите к строке 15A0, которая читается как 03 10 (маленький конец для 4099) и замените ее на FF 00 (который не существует).)

Я подумал, что для блага других я бы включил то, что я сделал.

Поскольку вы не можете заставить Visual Studio (в моем случае 2010) игнорировать предупреждения LNK4204, мой подход состоял в том, чтобы дать ему то, что он хотел:файлы pdb.Поскольку в моем случае я использовал библиотеки с открытым исходным кодом, у меня уже есть код для создания файлов pdb.

НО по умолчанию все PDF-файлы называются одинаково:vc100.pdb в моем случае.Поскольку вам нужна .pdb для каждой .lib-библиотеки, это создает проблему, особенно если вы используете что-то вроде ImageMagik, которое создает около 20 статических .lib-файлов.У вас не может быть 20 файлов lib в одном каталоге (на которые ссылается компоновщик вашего приложения в библиотеках) и чтобы все 20 файлов .pdb назывались одинаково.

Мое решение состояло в том, чтобы пойти и перестроить мои файлы статической библиотеки и настроить VS2010 на присвоение имени .pdb файлу в соответствии с ПРОЕКТОМ.Таким образом, каждая .библиотека получает файл с аналогичным именем .pdb, и вы можете поместить все библиотеки и PDF-файлы в один каталог для использования вашим проектом.

Итак, для конфигурации "Debug" я отредактировал:

Свойства-> Свойства конфигурации -> C / C ++ -> Выходные файлы -> Имя файла базы данных программы От

$(IntDir)vc$(PlatformToolsetVersion).pdb

должно быть следующим значением:

$(OutDir)vc$(PlatformToolsetVersion)D$(имяпроекта).pdb

Теперь вместо того, чтобы находиться где-то в промежуточном каталоге, файлы .pdb записываются в выходной каталог, куда также записываются .файлы lib, И, что наиболее важно, они называются с суффиксом D +название проекта.Это означает, что каждая библиотека проект создает проект .библиотека и специфичная для проекта .pdb.

Теперь я могу скопировать всю свою версию .файлы библиотеки, моя отладка .файлы lib и файлы debug .pdb в одном месте в моей системе разработки, и проект, который использует эту стороннюю библиотеку в режиме отладки, имеет файлы pdb, необходимые ему в режиме отладки.

Я подозреваю, что / ignore - это вариант VC6 link.exe .для компоновщика VS2005 и VS2008 нет задокументированной опции / ignore, но компоновщик выглядит просто игнорирующим опцию "/ ignore: XXX", без ошибок и без эффекта.

Файл PDB обычно используется для хранения отладочной информации.Это предупреждение вызвано, вероятно, тем, что файл vc80.pdb не найден при связывании целевого объектного файла.Прочитайте запись MSDN на LNK4099 здесь.

Кроме того, вы можете отключить генерацию отладочной информации в поле Свойства проекта > Компоновщик > Отладка > Сгенерировать отладочную информацию.

Редактировать:не используйте vc80 / Visual Studio 2005, но версии библиотеки CGAL Visual Studio 2008 / vc90 (возможно От здесь).

Предупреждение о средствах компоновки LNK4099:

Вы также могли бы скомпилироваться с / Z7, так что использовать pdb не обязательно, или удалите опцию компоновщика /DEBUG, если у вас нет файлов .pdb для объектов вы связываете.

Вы не можете отключить предупреждение компоновщика 4099, как сказал @John Weldon.

Вам следует перестроить библиотеку с некоторыми изменениями конфигурации проекта.У вас есть несколько вариантов:

  • Сохраните PDB-файл с отладочной информацией в той же папке, где вы сохраняете.lib-файл.Установите значение "$(OutDir)$(TargetName).pdb" в Свойства->C /C ++-> Выходные файлы-Имя файла базы данных программы
  • Сохраните отладочную информацию в lib-файле .Установите значение "Совместимость с C7 (/Z7)" в Свойства->C/C ++-> Общие-> Формат отладочной информации
  • Отключите генерацию отладочной информации для этой библиотеки.Удалить значение из Properties->C / C ++->General-> Формат отладочной информации
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top