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

Я использую библиотеку из 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 С++/Studio 2008?

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

Ответ 1

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

 /ignore:4099

Это находится в Properties- > Linker- > Command Line

Ответ 2

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

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

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

Не совсем неистребимые предупреждения

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

Уязвимы следующие номера предупреждений:

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

Ответ 3

(Для записи и до того, как поток исчезнет на форумах 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 (немного endian для 4099) и заменит ее FF 00 (которая не существует. )

Ответ 4

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

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

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

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

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

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

$(IntDir) $VC (PlatformToolsetVersion).pdb

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

$(OutDir) $VC (PlatformToolsetVersion) D $(Имя_проекта).pdb

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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