Visual C ++: Jak wyłączyć określone ostrzeżenia konsolidatora?

118

Używam biblioteki z CGAL, która na etapie linkowania mojej kompilacji kodu generuje wiele ostrzeżeń dotyczących linkowania w tej postaci:

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

Jak wyłączyć to ostrzeżenie dotyczące konsolidatora w programie Visual C ++ / Studio 2008?

Zauważ, że nie mam żadnej kontroli nad biblioteką zewnętrzną (CGAL), której używam. Nie mogę / nie chcę brać udziału w ponownej kompilacji biblioteki zewnętrznej. Stąd potrzeba naprawienia wiadomości po mojej stronie.

Ashwin Nanjappa
źródło
1
Dla VS2005 / ignore: 4099 działa dobrze.
/ ignore: 4099 działa dobrze tutaj z VS2008.
Tom
/ignore:4099działa dobrze w programie Visual Studio 10 z C ++. Otrzymałem ostrzeżenie LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)i udało mi się je w ten sposób usunąć.
Manolete
Zobacz także: Nie można wyłączyć „ostrzeżenia LNK4099”
Daniel Trebbien,
3
VS2013 akceptuje / ignoruje: 4099 w porządku :)
mlvljr

Odpowiedzi:

101

Dodaj następujące opcje jako dodatkową opcję konsolidatora:

 /ignore:4099

To jest w Właściwości-> Konsolidator-> Wiersz poleceń

Aaron Saarela
źródło
5
Nie sądzę / ignoruję istnieje. Błędy są nadal wyświetlane, a / ignore nie jest udokumentowane w MSDN. Próbuję wyłączyć 4075 dla „ostrzeżenia LNK4075: ignorowanie„ / EDYTUJ I KONTYNUUJ ”ze względu na specyfikację„ / INCREMENTAL: NO ”.
Nick Desjardins
1
/ IGNORE nie jest udokumentowane, ale jest dostępne. Zobacz connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela
5
Nie działa w przypadku ostrzeżenia 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/ ...
KindDragon
7
Możesz użyć / ignore: 4099 jako flagi konsolidatora, ale jest pewien haczyk. Niestety, Microsoft zdecydował się ustawić 4099 jako ostrzeżenie, którego nie można ignorować, więc musisz załatać link.exe. Brzmi trochę szalenie, ale po prostu nie ma innego wyjścia. Więcej szczegółów tutaj: bottledlight.com/docs/lnk4099.html Użyłem HxD jako edytora szesnastkowego i postępowanie zgodnie z opisem na tej stronie działało dobrze z VS10. Zamówienie nadal wynosi 4088, 4099, 4105.
Andreas Haferburg
2
Działa na VS 2015 (projekt korzysta z zestawu narzędzi VS2013, nie jestem pewien, czy to robi różnicę)
Assimilater
50

Aktualizacja 2018-10-16

Podobno od VS 2013 to ostrzeżenie można wyłączyć. Zobacz komentarz @Mark Ransom.

Oryginalna odpowiedź

Nie możesz wyłączyć tego konkretnego ostrzeżenia.

Według Geoffa Chappella ostrzeżenie 4099 jest traktowane tak, jakby było zbyt ważne, aby je zignorować, nawet używając w połączeniu z / wx (co potraktuje ostrzeżenia jako błędy i zignoruje określone ostrzeżenie w innych sytuacjach)

Oto odpowiedni tekst z linku:

Niezupełnie nieuniknione ostrzeżenia

W przypadku niektórych numerów ostrzeżeń specyfikacja w opcji / ignore jest akceptowana, ale niekoniecznie jest stosowana. Jeśli ostrzeżenie wystąpi, gdy opcja / wx nie jest aktywna, komunikat ostrzegawczy jest nadal wyświetlany, ale jeśli opcja / wx jest aktywna, ostrzeżenie jest ignorowane. To tak, jakby ostrzeżenie było uważane za dostatecznie ważne, aby zignorować próbę jego zignorowania, ale nie wtedy, gdy użytkownik wyceni niezignorowane ostrzeżenia zbyt wysoko.

Dotyczy to następujących numerów ostrzeżeń:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
John Weldon
źródło
Nie mówi, że „ostrzeżenie 4099 jest zbyt ważne, aby je zignorować”; wnioskuje to z faktu, że nie można go wyłączyć. (Zauważono tutaj, ponieważ pod tym linkiem nie ma żadnych dodatkowych informacji.)
Ben M,
Zaktualizowano, aby rozwiązać Twój problem @BenM
John Weldon,
1
Ta odpowiedź jest stara , wyłączenie ostrzeżenia 4099 działało dobrze dla mnie na VS2017. Z komentarzy tutaj wynika, że ​​można go wyłączyć prawdopodobnie począwszy od VS2013.
Mark Ransom
10

(Dla porządku i zanim wątek zniknie na forach msdn) Nie możesz wyłączyć ostrzeżenia (przynajmniej pod VS2010), ponieważ znajduje się na liście ostrzeżeń, których nie można wyłączyć (więc / wd4099 nie będzie działać) , ale zamiast tego możesz zrobić patch link.exe (zwykle C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe), aby usunąć go z tej listy. Wiem, brzmi jak młot pneumatyczny. Ale działa.

Na przykład, jeśli chcesz usunąć ostrzeżenie dla 4099, otwórz link.exe za pomocą edytora szesnastkowego, przejdź do wiersza 15A0, który czyta 03 10 (little endian dla 4099) i zamień go na FF 00 (który nie istnieje).

Gurg Hackpof
źródło
5
Powinieneś szukać sekwencji F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 jako 32-bitowe podwójne słowa w little endian). To samo dotyczy amd64 / link.exe.
Andreas Haferburg,
8

Pomyślałem, że dla dobra innych uwzględnię to, co zrobiłem.

Ponieważ nie możesz zmusić Visual Studio (w moim przypadku 2010) do ignorowania ostrzeżeń LNK4204, moim podejściem było zapewnienie mu tego, czego chciał: plików pdb. Ponieważ w moim przypadku korzystałem z bibliotek open source, mam już kod budujący pliki pdb.

ALE, domyślnie wszystkie pliki PDF są nazwane tak samo: w moim przypadku vc100.pdb. Ponieważ potrzebujesz pliku .pdb dla każdego pliku .lib, stwarza to problem, szczególnie jeśli używasz czegoś takiego jak ImageMagik, który tworzy około 20 statycznych plików .lib. Nie możesz mieć 20 plików lib w jednym katalogu (do którego linker twojej aplikacji odwołuje się w bibliotekach) i mieć wszystkie 20 plików .pdb o nazwie to samo.

Moim rozwiązaniem było odbudowanie plików biblioteki statycznej i skonfigurowanie VS2010 tak, aby nazwał plik .pdb w odniesieniu do PROJEKTU. W ten sposób każdy plik .lib otrzymuje podobnie nazwany plik .pdb i możesz umieścić wszystkie biblioteki LIB i PDB w jednym katalogu do wykorzystania przez projekt.

Tak więc dla konfiguracji „Debugowanie” zmodyfikowałem:

Właściwości -> Właściwości konfiguracji -> C / C ++ -> Pliki wyjściowe -> Nazwa pliku bazy danych programu z

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

być następującą wartością:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (ProjectName) .pdb

Teraz, zamiast gdzieś w katalogu pośrednim, pliki .pdb są zapisywane do katalogu wyjściowego, w którym zapisywane są również pliki .lib, ORAZ, co najważniejsze, są one nazywane z przyrostkiem nazwy projektu D + . Oznacza to, że każdy projekt biblioteki wytwarza projekt .lib i plik .pdb specyficzny dla projektu.

Teraz mogę skopiować wszystkie moje pliki .lib wydania, pliki debugowania .lib i pliki debugowania .pdb w jedno miejsce w moim systemie programistycznym, a projekt, który korzysta z tej biblioteki innej firmy w trybie debugowania, ma pdb pliki, których potrzebuje w trybie debugowania.

Minok
źródło
2
Powiedziałbym, że jest to odpowiedź na pytanie. Sugestia PATCHING THE LINKER, którą zawiera wiele odpowiedzi, jest bezsensowna. Nawet jeśli Microsoft „myli się”, czyniąc to ostrzeżenie nie do zignorowania.
Tamás Szelei
3
To jest poprawna odpowiedź JEŚLI kompilujesz bibliotekę ze źródła. Jednak niektóre programy są zależne od komercyjnych bibliotek, które nie zawierają plików .pdb, więc generowanie dla nich pliku .pdb nie jest opcją.
Bryce Wagner
3

Podejrzewam / ignoruję, że jest to opcja link.exe VC6. dla konsolidatora VS2005 i VS2008 nie ma udokumentowanej opcji / ignoruj, ale wygląda na to, że konsolidator ignoruje opcję "/ ignore: XXX", bez błędu i bez efektu.

zhaorufei
źródło
2
W rzeczywistości zaleca się, aby nie ignorować ostrzeżeń linkera, więc flaga ignorowania została wyłączona po VC6: bytes.com/topic/net/answers/…
Gyuri
/ ignore może zostać ponownie użyte w VS2013.
Fernando Gonzalez Sanchez
1

Plik PDB jest zwykle używany do przechowywania informacji debugowania. To ostrzeżenie jest prawdopodobnie spowodowane tym, że plik vc80.pdbnie został znaleziony podczas łączenia z docelowym plikiem obiektu. Przeczytaj wpis MSDN na temat LNK4099 tutaj .

Alternatywnie można wyłączyć generowanie informacji debugowania w polu Właściwości projektu> Konsolidator> Debugowanie> Generuj informacje debugowania.

dirkgently
źródło
3
Wyłączenie informacji debugowania rozwiązuje ostrzeżenia konsolidatora, ale wtedy punkty przerwania nie działają bez informacji debugowania. Nie jest to dla mnie zbyt przydatne.
Ashwin Nanjappa,
2
Wyłączanie ostrzeżeń nigdy nie jest właściwe. Napraw je. Musisz znaleźć pdb i dopilnować, aby został skopiowany do właściwej lokalizacji.
dirkgently
Ech, to prawda! Niestety w tym przypadku nie mogę znaleźć tego pdb.
Ashwin Nanjappa,
1
vc80.pdb to po prostu domyślna nazwa PDB dla vc8. To ostrzeżenie oznacza po prostu, że dla biblioteki CGAL nie ma dostępnych informacji debugowania. Bezpiecznie jest to zignorować.
JoeG
1

EDIT: nie używać vc80 / Visual Studio 2005, ale Visual Studio 2008 / vc90 wersje biblioteki CGAL (być może z tutaj ).

Ostrzeżenie narzędzi konsolidatora LNK4099 :

Możesz również skompilować z / Z7, więc pdb nie musi być używany, lub usunąć opcję konsolidatora / DEBUG, jeśli nie masz plików .pdb dla obiektów, które łączysz.

topór.
źródło
2
Dzięki. Kompilacja z / Z7 nadal pyta o plik .pdb biblioteki CGAL. / DEBUG rozwiązuje ostrzeżenia konsolidatora, ale wtedy punkty przerwania nie działają bez informacji debugowania.
Ashwin Nanjappa
1

Nie można wyłączyć ostrzeżenia konsolidatora 4099, jak powiedział @John Weldon.

Należy przebudować bibliotekę z pewnymi zmianami konfiguracji projektu. Masz kilka możliwości:

  • Zapisz plik PDB z informacjami debugowania to ten sam folder, w którym zapisujesz plik .lib. Ustaw wartość „$ (OutDir) $ (TargetName) .pdb” na Właściwości-> C / C ++ -> Pliki wyjściowe - Nazwa pliku bazy danych programu
  • Zapisz informacje debugowania w pliku .lib. Ustaw wartość „Zgodny z C7 (/ Z7)” na Właściwości-> C / C ++ -> Ogólne-> Format informacji debugowania
  • Wyłącz informacje debugowania generacji dla tej biblioteki. Usuń wartość z Właściwości-> C / C ++ -> Ogólne-> Format informacji debugowania
KindDragon
źródło