Visual C ++: как отключить определенные предупреждения компоновщика? - PullRequest
113 голосов
/ 19 марта 2009

Я использую библиотеку из 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) библиотекой, которую я использую. Я не могу / не хочу перекомпилировать внешнюю библиотеку. Отсюда и необходимость исправлять сообщения на моем конце.

Ответы [ 8 ]

96 голосов
/ 19 марта 2009

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

 /ignore:4099

Это в Свойства-> Линкер-> Командная строка

47 голосов
/ 25 сентября 2009

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

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

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

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

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

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

Не совсем несправедливые предупреждения

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

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

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
9 голосов
/ 24 июня 2013

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

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

8 голосов
/ 09 августа 2014

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

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

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

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

Итак, для конфигурации «Отладка» я отредактировал:

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

$ (IntDir) $ VC (PlatformToolsetVersion) .pdb

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

$ (OutDir) $ VC (PlatformToolsetVersion) D $ (ProjectName) .pdb

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

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

3 голосов
/ 04 мая 2009

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

1 голос
/ 06 июля 2012

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

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

  • Сохраните файл PDB с отладочной информацией в той же папке, в которой вы сохранили файл .lib. Установите значение "$ (OutDir) $ (TargetName) .pdb" в Свойства-> C / C ++ -> Выходные файлы - Имя файла базы данных программы
  • Сохранить отладочную информацию в .lib файле. Установите значение «Совместимость с C7 (/ Z7)» в «Свойства» -> «C / C ++ -> Общие сведения -> Формат отладочной информации»
  • Отключить отладочную информацию для этой библиотеки. Удалить значение из Свойства-> C / C ++ -> Общие-> Формат отладочной информации
1 голос
/ 19 марта 2009

РЕДАКТИРОВАТЬ: не используйте vc80 / Visual Studio 2005, но версии библиотеки CGAL для Visual Studio 2008 / vc90 (возможно из здесь ).

Предупреждение Linker Tools LNK4099 :

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

1 голос
/ 19 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...