2009-03-19 6 views
100

Я использую библиотеку из CGAL, которые на стадии связующей моей компиляции коды производит много ссылающегося предупреждение этой формы:Visual C++: как отключить определенные предупреждения компоновщика?

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/игнорирование: 4099 отлично работает. – 2010-08-18 13:07:50

+0

/ignore: 4099 отлично работает здесь с VS2008. – Tom

+0

'/ ignore: 4099' отлично работает в Visual Studio 10 с C++. Я получил предупреждение 'LNK4099: PDB 'vc100.pdb' не был найден с 'gtest_main-mdd.lib (gtest_main.obj)' и удалил его таким образом. – Manolete

ответ

78

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

/ignore:4099 

Это в Свойства-> Linker-> Командная строка

+6

Странно, но это не сработает! Я все еще вижу ошибки! –

+5

Я не думаю, что/ignore существует. Ошибки все еще перечислены, и/ignore не документируется в MSDN. Я пытаюсь отключить 4075 для «предупреждения LNK4075: игнорирование«/EDITANDCONTINUE »из-за спецификации«/INCREMENTAL: NO »». –

+1

/IGNORE не документирован, но доступен. См. Http://connect.microsoft.com/VisualStudio/feedback/details/176188/can-not-disable-warning-lnk4099 –

2

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

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

+2

Отключение информации об отладке решает предупреждения компоновщика, но тогда точки останова не работают без отладочной информации. Это не очень полезно для меня. –

+2

Отключение предупреждений никогда не будет правильным. Исправьте их. Вам нужно найти pdb и убедиться, что он скопирован в нужное место. – dirkgently

+0

Вздох, это правда! К сожалению, в этом случае я не могу найти этот pdb. –

1

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

Linker Tools Warning LNK4099:

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

+2

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

3

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

+2

На самом деле, это не позволяет игнорировать предупреждения компоновщика, поэтому флаг игнорирования был отключен после VC6: http: // bytes.com/topic/net/answers/264543-linker-ignore-option-no-longer-support – Gyuri

+0

/ignore можно снова использовать в VS2013. –

43

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

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

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

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

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

следующие цифры предупреждения поражаются:

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

+1 для ссылки на Джеффа Чаппелла. – 0xC0000022L

+0

Он не говорит, что «предупреждение 4099 слишком важно игнорировать»; он объясняет это тем, что его нельзя отключить. (Отмечено здесь, поскольку на эту ссылку добавлена ​​нулевая дополнительная информация.) –

+0

Обновлено для решения вашей проблемы @BenM –

1

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

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

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

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

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

+4

Вы должны искать последовательность F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 as 32-битные двойные слова в маленьком конце). Это то же самое в amd64/link.exe. –

+0

Подтверждено все еще работающее для VC++ 2012 amd64. – Noora

7

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

Поскольку вы не можете получить 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 в один каталог для вашего проекта.

Так что для "Отладка" configuraton, я редактировал:

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

$ (IntDir) $ VC (PlatformToolsetVersion) .pdb

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

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

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

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

+1

Я бы сказал, что это * * ответ на вопрос. Предложение PATCHING THE LINKER, содержащее много ответов, является asinine. Даже если Microsoft «ошибается» в том, чтобы сделать это предупреждение неуязвимым. –

+0

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