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 файлы, необходимые в режиме отладки.


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

3
Это правильный ответ, ЕСЛИ вы компилируете библиотеку из исходников. Но некоторые программы зависят от коммерческих библиотек, которые не включают файлы .pdb, поэтому создание для них файла .pdb не вариант.
— Брайс Вагнер

3

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


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

/ ignore можно снова использовать в VS2013.
— Фернандо Гонсалес Санчес

1

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.