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 працює чудово.

/ ігнорувати: 4099 тут чудово працює з VS2008.
Том

/ignore:4099прекрасно працює у Visual Studio 10 із C ++. Я отримав попередження LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)і вдалося його зняти таким чином.
Манолет


3
VS2013 приймає / ігнорує: 4099 просто чудово :)
mlvljr

Відповіді:


101

Додайте наступне як додатковий варіант зв’язку:

 /ignore:4099

Це у Властивості-> Linker-> Командний рядок


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
Ви можете використовувати / ігнорувати: 4099 як прапор посилання, але є улов. На жаль, Microsoft вирішила зробити 4099 непередбачуваним попередженням, тому вам доведеться зафіксувати link.exe. Звучить якось божевільно, але іншого способу просто немає. Більше деталей тут: bottleledlight.com/docs/lnk4099.html Я використовував HxD як шестигранний редактор, і дотримуючись опису на цій сторінці, добре працював з VS10. Замовлення все ще 4088, 4099, 4105.
Андреас Хафербург

2
Працює над VS 2015 (проект використовує набір інструментів VS2013, не впевнений, чи це має значення)
Асимілятор

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 занадто важливе, щоб його ігнорувати"; він робить це з того, що його не можна вимкнути. (Помічено тут, оскільки на цьому посиланні немає нульової додаткової інформації.)
Ben M

Оновлено, щоб вирішити вашу проблему @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 "помиляється", роблячи це попередження не ігноруваним.
Tamás Szelei

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 тут .

Можна також вимкнути генерацію інформації про налагодження з поля Властивості проекту> Linker> Налагодження> Створення інформації про налагодження.


3
Вимкнення інформації про налагодження вирішує попередження лінкера, але тоді точки прориву не працюють без інформації про налагодження. Це для мене не дуже корисно.
Ешвін Нанджаппа

2
Вимкнення попереджень ніколи не підходить. Виправити їх. Вам потрібно знайти pdb і переконатися, що він буде скопійований у потрібне місце.
примхливо

Зітхніть, це правда! На жаль, у цьому випадку я не можу знайти цей pdb.
Ешвін Нанджаппа

1
vc80.pdb - це лише стандартна назва pdb для vc8. Це попередження просто означає, що для бібліотеки CGAL немає інформації про налагодження. Це безпечно ігнорувати.
JoeG

1

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

Інструменти для в'язки попередження LNK4099 :

Ви також можете компілювати з / Z7, тому pdb не потрібно використовувати або видаляти параметр / DEBUG linker, якщо у вас немає .pdb файлів для об'єктів, з якими ви посилаєтеся.


2
Дякую. Компіляція з / Z7 все ще вимагає .pdb-файлу бібліотеки CGAL. / DEBUG вирішує попередження лінкера, але тоді точки прориву не працюють без інформації про налагодження.
Ешвін Нанджаппа

1

Ви не можете відключити попередження 4099 для зв'язків, як сказав @John Weldon.

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

  • Зберегти файл PDB з інформацією про налагодження - це та сама папка, де ви зберігаєте .lib файл. Встановіть значення "$ (OutDir) $ (TargetName) .pdb" у Властивості-> C / C ++ -> Вихідні файли-Назва файлу бази даних програми
  • Збережіть інформацію про налагодження у файлі .lib. Встановіть значення "C7 сумісний (/ Z7)" у Властивості-> C / C ++ -> Загальне-> Формат інформації про налагодження
  • Вимкнути інформацію про налагодження генерації для цієї бібліотеки. Видаліть значення з властивостей-> C / C ++ -> Загальне-> Формат інформації про налагодження
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.