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

Я использую библиотеку из 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 ответов


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

 /ignore:4099

это в свойствах - >Компоновщик - > Командная строка


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

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

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

Не Совсем Unignorable Предупреждения

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

следующие предупреждающие номера затронуто:

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

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

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


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

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

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

моим решением было пойти и перестроить мои статические файлы библиотеки и настроить VS2010 на имя.pdb-файл в отношении проекта. Сюда, каждый .lib получает аналогичное имя .pdb, и вы можете положить все библиотеки и PDBs в одном каталоге для вашего проекта.

поэтому для конфигурации "Debug" я отредактировал:

Свойства - >Свойства Конфигурации - > C / C++ - > Выходные Файлы - > Имя Файла Базы Данных Программы С

$(IntDir) vc$(PlatformToolsetVersion).pdb

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

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

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

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


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


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

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


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

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

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


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

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

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