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


person Ashwin Nanjappa    schedule 19.03.2009    source источник
comment
Для VS2005 / ignore: 4099 работает нормально.   -  person    schedule 18.08.2010
comment
/ ignore: 4099 отлично работает с VS2008.   -  person Tom    schedule 04.10.2010
comment
/ignore:4099 отлично работает в Visual Studio 10 с C ++. Я получил предупреждение LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj) и смог удалить его таким образом.   -  person Manolete    schedule 13.05.2011
comment
См. Также: Невозможно отключить предупреждение LNK4099.   -  person Daniel Trebbien    schedule 14.10.2011
comment
VS2013 принимает / игнорирует: 4099 просто отлично :)   -  person mlvljr    schedule 19.01.2015


Ответы (8)


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

 /ignore:4099

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

person Aaron Saarela    schedule 19.03.2009
comment
Я не думаю, что существует / игнорируется. Ошибки по-прежнему перечислены, а / ignore не задокументирован в MSDN. Я пытаюсь отключить 4075 для предупреждения LNK4075: игнорирование '/ EDITANDCONTINUE' из-за спецификации '/ INCREMENTAL: NO'. - person Nick Desjardins; 02.03.2010
comment
/ IGNORE не документирован, но доступен. См. connect.microsoft.com/VisualStudio/feedback / details / 176188 / - person Aaron Saarela; 12.05.2011
comment
/ ignore, похоже, не работает для цели Windows CE (SH4) в Visual Studio 2008. - person akauppi; 20.10.2011
comment
Не работает для предупреждения 4099 connect.microsoft .com / VisualStudio / feedback / details / 176188 / - person KindDragon; 21.12.2011
comment
Вы можете использовать / ignore: 4099 в качестве флага компоновщика, но здесь есть одна загвоздка. К сожалению, Microsoft решила сделать 4099 неотъемлемым предупреждением, поэтому вам необходимо исправить файл link.exe. Звучит безумно, но другого выхода просто нет. Подробнее здесь: botledlight.com/docs/lnk4099.html Я использовал HxD в качестве шестнадцатеричный редактор, и, следуя описанию на этой странице, отлично работал с VS10. Порядок еще 4088, 4099, 4105. - person Andreas Haferburg; 13.02.2012
comment
Для меня botledlight.com тоже был 404, но есть этот блог bitsquid опубликован в конце 2011 года. Предоставленный код ruby ​​перечисляет все версии link.exe, делает резервные копии и выполняет простую замену при поиске. Он заменяет [4088, 4099, 4105] на [4088, 65535, 4105]. - person Millie Smith; 08.01.2016
comment
Также это. michaelnoland.com/ - person Millie Smith; 08.01.2016
comment
/ignore:4099, похоже, не работает с обновлением VS12 3 - person Millie Smith; 13.01.2016
comment
Работает на VS 2015 (в проекте используется набор инструментов VS2013, не уверен, что это имеет значение) - person Assimilater; 27.05.2016

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

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

Исходный ответ

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

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

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

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

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

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

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
person John Weldon    schedule 25.09.2009
comment
Он не говорит, что предупреждение 4099 слишком важно, чтобы его игнорировать; он делает это из того факта, что его нельзя выключить. (Отмечено здесь, поскольку по этой ссылке нет дополнительной информации.) - person Ben M; 08.12.2012
comment
Обновлено для решения вашей проблемы @BenM - person John Weldon; 08.12.2012
comment
Это старый ответ, отключение предупреждения 4099 отлично работало для меня на VS2017. Из комментариев здесь видно, что его можно отключить, вероятно, начиная с VS2013. - person Mark Ransom; 16.10.2018

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

person Gurg Hackpof    schedule 24.06.2013
comment
Вам следует искать последовательность F8 0F 00 00-03 10 00 00-09 10 00 00 (4088, 4099, 4105 как 32-битные двойные слова с прямым порядком байтов). То же самое и в amd64 / link.exe. - person Andreas Haferburg; 20.08.2013

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

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

person Minok    schedule 08.08.2014
comment
Я бы сказал, что это ответ на вопрос. Предложение ПАТЧАТЬ ЛИНКЕР, которое содержится во многих ответах, глупо. Даже если Microsoft ошибается, делая это предупреждение неотразимым. - person Tamás Szelei; 30.05.2016
comment
Это правильный ответ, ЕСЛИ вы собираете библиотеку из исходников. Но некоторые программы зависят от коммерческих библиотек, которые не включают файлы .pdb, поэтому создание для них файла .pdb не вариант. - person Bryce Wagner; 30.11.2017

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

person zhaorufei    schedule 04.05.2009
comment
Фактически, рекомендуется не игнорировать предупреждения компоновщика, поэтому флаг игнорирования был отключен после VC6: bytes.com/topic/net/answers/ - person Gyuri; 17.02.2010
comment
/ ignore можно снова использовать в VS2013. - person Fernando Gonzalez Sanchez; 06.06.2015

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

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

person dirkgently    schedule 19.03.2009
comment
Отключение отладочной информации устраняет предупреждения компоновщика, но тогда точки останова не работают без отладочной информации. Для меня это не очень полезно. - person Ashwin Nanjappa; 19.03.2009
comment
Отключение предупреждений - неправильный поступок. Исправьте их. Вам нужно найти pdb и проследить, чтобы он был скопирован в нужное место. - person dirkgently; 19.03.2009
comment
Вздох, это правда! К сожалению, в этом случае я не могу найти этот pdb. - person Ashwin Nanjappa; 20.03.2009
comment
vc80.pdb - это просто имя pdb по умолчанию для vc8. Это предупреждение просто означает, что для библиотеки CGAL нет отладочной информации. Это безопасно игнорировать. - person JoeG; 04.10.2010

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

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

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

person ax.    schedule 19.03.2009
comment
Спасибо. При компиляции с / Z7 по-прежнему запрашивается файл .pdb библиотеки CGAL. / DEBUG устраняет предупреждения компоновщика, но тогда точки останова не работают без отладочной информации. - person Ashwin Nanjappa; 19.03.2009

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

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

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