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

118

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

Ашвин Нанджаппа
источник
1
Для VS2005 / ignore: 4099 работает нормально.
/ ignore: 4099 отлично работает с VS2008.
Том
/ignore:4099отлично работает в Visual Studio 10 с C ++. Я получил предупреждение LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)и смог удалить его таким образом.
Manolete
3
VS2013 принимает / игнорирует: 4099 просто отлично :)
mlvljr

Ответы:

101

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

 /ignore:4099

Это в Properties-> Linker-> Command Line

Аарон Саарела
источник
5
Я не думаю, что / игнорировать существует. Ошибки по-прежнему перечислены, а / ignore не задокументирован в MSDN. Я пытаюсь отключить 4075 для «предупреждения LNK4075: игнорирование '/ EDITANDCONTINUE' из-за спецификации '/ INCREMENTAL: NO'».
Ник Дежарден,
1
/ IGNORE не документирован, но доступен. См. Connect.microsoft.com/VisualStudio/feedback/details/176188/…
Аарон Саарела,
5
Не работает для предупреждения 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon
7
Вы можете использовать / ignore: 4099 в качестве флага компоновщика, но есть одна загвоздка. К сожалению, Microsoft решила сделать 4099 неоспоримым предупреждением, поэтому вам необходимо исправить файл link.exe. Звучит безумно, но другого пути просто нет. Более подробная информация здесь: botledlight.com/docs/lnk4099.html Я использовал HxD в качестве шестнадцатеричного редактора и, следуя описанию на этой странице, отлично работал с VS10. Порядок по-прежнему 4088, 4099, 4105.
Андреас Хафербург,
2
Работает на VS 2015 (проект использует набор инструментов VS2013, не уверен, что это имеет значение)
Assimilater
50

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

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

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

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

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

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

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

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

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

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
Джон Велдон
источник
Он не говорит, что «предупреждение 4099 слишком важно, чтобы его игнорировать»; он делает это из того факта, что его нельзя выключить. (Отмечено здесь, поскольку по этой ссылке нет дополнительной информации.)
Бен М.
Обновлено для решения вашей проблемы @BenM
Джон Велдон,
1
Этот ответ старый , отключение предупреждения 4099 отлично работало для меня на VS2017. Из комментариев здесь видно, что его можно отключить, вероятно, начиная с VS2013.
Марк Рэнсом
10

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

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

Гург Хакпоф
источник
5
Вы должны искать последовательность F8 0F 00 00-03 10 00 00-09 10 00 00 (4088, 4099, 4105 как 32-битные двойные слова с прямым порядком байтов). То же самое и в amd64 / link.exe.
Андреас Хафербург
8

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

Поскольку вы не можете заставить 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 + . Это означает, что каждый проект библиотеки создает файл .lib проекта и отдельный файл .pdb проекта.

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

Minok
источник
2
Я бы сказал , что это ответ на этот вопрос. Предложение ПАТЧАТЬ ЛИНКЕР, которое содержится во многих ответах, бессмысленно. Даже если Microsoft «ошибается», делая это предупреждение неотразимым.
Тамаш Селей
3
Это правильный ответ, ЕСЛИ вы компилируете библиотеку из исходников. Но некоторые программы зависят от коммерческих библиотек, которые не включают файлы .pdb, поэтому создание для них файла .pdb не вариант.
Брайс Вагнер
3

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

zhaorufei
источник
2
На самом деле, рекомендуется не игнорировать предупреждения компоновщика, поэтому флаг игнорирования был отключен после VC6: bytes.com/topic/net/answers/…
Gyuri
/ ignore можно снова использовать в VS2013.
Фернандо Гонсалес Санчес
1

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

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

dirkgently
источник
3
Отключение отладочной информации устраняет предупреждения компоновщика, но тогда точки останова не работают без отладочной информации. Для меня это не очень полезно.
Эшвин Нанджаппа,
2
Отключение предупреждений - неправильный поступок. Исправьте их. Вам нужно найти pdb и проследить, чтобы он был скопирован в нужное место.
dirkgently
Вздох, это правда! К сожалению, в этом случае я не могу найти этот pdb.
Эшвин Нанджаппа,
1
vc80.pdb - это просто имя pdb по умолчанию для vc8. Это предупреждение просто означает, что для библиотеки CGAL нет отладочной информации. Это безопасно игнорировать.
JoeG
1

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

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

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

Топор.
источник
2
Спасибо. При компиляции с / Z7 по-прежнему запрашивается файл .pdb библиотеки CGAL. / DEBUG устраняет предупреждения компоновщика, но тогда точки останова не работают без отладочной информации.
Эшвин Нанджаппа,
1

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

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

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