Visual C ++: Bagaimana cara menonaktifkan peringatan linker tertentu?

118

Saya menggunakan pustaka dari CGAL yang selama tahap penautan kompilasi kode saya menghasilkan banyak peringatan penautan dalam bentuk ini:

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

Bagaimana cara menonaktifkan peringatan linker khusus ini di bawah Visual C ++ / Studio 2008?

Perhatikan bahwa saya tidak memiliki kontrol apa pun pada pustaka eksternal (CGAL) yang saya gunakan. Saya tidak bisa / tidak ingin mengkompilasi ulang perpustakaan eksternal. Oleh karena itu, kebutuhan untuk memperbaiki pesan di akhir saya.

Ashwin Nanjappa
sumber
1
Untuk VS2005 / ignore: 4099 berfungsi dengan baik.
/ ignore: 4099 berfungsi dengan baik di sini dengan VS2008.
Tom
/ignore:4099berfungsi dengan baik di Visual Studio 10 dengan C ++. Saya mendapat peringatan LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)dan berhasil menghapusnya dengan cara ini.
Manolete
3
VS2013 menerima / mengabaikan: 4099 baik-baik saja :)
mlvljr

Jawaban:

101

Tambahkan yang berikut ini sebagai opsi penaut tambahan:

 /ignore:4099

Ini ada di Properties-> Linker-> Command Line

Aaron Saarela
sumber
5
Saya tidak berpikir / mengabaikan ada. Galat masih terdaftar, dan / abaikan tidak didokumentasikan di MSDN. Saya mencoba menonaktifkan 4075 untuk "peringatan LNK4075: mengabaikan '/ EDITANDCONTINUE' karena spesifikasi '/ INCREMENTAL: NO'."
Nick Desjardins
1
/ IGNORE tidak didokumentasikan tetapi tersedia. Lihat connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela
5
Tidak berfungsi untuk peringatan 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon
7
Anda bisa menggunakan / ignore: 4099 sebagai flag linker, tapi ada batasannya. Sayangnya, Microsoft memutuskan untuk membuat 4099 peringatan yang tidak dapat diabaikan, jadi Anda harus menambal link.exe. Kedengarannya agak gila, tapi tidak ada cara lain. Lebih jelasnya di sini: bottledlight.com/docs/lnk4099.html Saya menggunakan HxD sebagai editor hex, dan mengikuti deskripsi di halaman itu bekerja dengan baik dengan VS10. Urutannya masih 4088, 4099, 4105.
Andreas Haferburg
2
Bekerja pada VS 2015 (proyek menggunakan perangkat VS2013, tidak yakin apakah itu membuat perbedaan)
Assimilater
50

Perbarui 2018-10-16

Kabarnya, mulai VS 2013, peringatan ini bisa dinonaktifkan. Lihat komentar oleh @Mark Ransom.

Jawaban Asli

Anda tidak dapat menonaktifkan peringatan khusus itu.

Menurut Geoff Chappell , peringatan 4099 diperlakukan seolah-olah terlalu penting untuk diabaikan, bahkan jika digunakan bersama dengan / wx (yang akan menganggap peringatan sebagai kesalahan dan mengabaikan peringatan yang ditentukan dalam situasi lain)

Berikut teks yang relevan dari tautan:

Bukan Peringatan yang Cukup Tidak Menarik

Untuk beberapa nomor peringatan, spesifikasi dalam opsi a / abaikan diterima tetapi tidak harus ditindaklanjuti. Jika peringatan terjadi saat opsi / wx tidak aktif, maka pesan peringatan tetap ditampilkan, tetapi jika opsi / wx aktif, peringatan tersebut diabaikan. Seolah-olah peringatan dianggap cukup penting untuk menggantikan upaya mengabaikannya, tetapi tidak jika pengguna telah memberi harga yang terlalu tinggi pada peringatan yang tidak diabaikan.

Nomor peringatan berikut terpengaruh:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
John Weldon
sumber
Dia tidak mengatakan "peringatan 4099 terlalu penting untuk diabaikan"; dia menyimpulkan ini dari fakta bahwa itu tidak dapat dimatikan. (Tercatat di sini karena tidak ada informasi tambahan di tautan itu.)
Ben M
Diperbarui untuk mengatasi masalah Anda @BenM
John Weldon
1
Jawaban ini sudah lama , menonaktifkan peringatan 4099 berfungsi dengan baik untuk saya di VS2017. Tampak dari komentar di sini bahwa itu dapat dinonaktifkan mungkin dimulai dengan VS2013.
Markus Tebusan
10

(Sebagai catatan dan sebelum utas menghilang di forum msdn) Anda tidak dapat menonaktifkan peringatan (setidaknya di bawah VS2010) karena ada di daftar peringatan yang tidak dapat dinonaktifkan (jadi / wd4099 tidak akan berfungsi) , tetapi yang dapat Anda lakukan adalah menambal link.exe (biasanya C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) untuk menghapusnya dari daftar tersebut. Kedengarannya seperti jackhammer, saya tahu. Itu berhasil.

Misalnya, jika Anda ingin menghapus peringatan untuk 4099, buka link.exe dengan editor hex, goto baris 15A0 yang bertuliskan 03 10 (little endian untuk 4099) dan ganti dengan FF 00 (yang tidak ada.)

Gurg Hackpof
sumber
5
Anda harus mencari urutan F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 sebagai kata ganda 32 bit dalam little endian). Ini sama di amd64 / link.exe.
Andreas Haferburg
8

Untuk kepentingan orang lain, saya pikir saya akan memasukkan apa yang saya lakukan.

Karena Anda tidak bisa mendapatkan Visual Studio (2010 dalam kasus saya) untuk mengabaikan peringatan LNK4204, pendekatan saya adalah memberikan apa yang diinginkannya: file pdb. Karena saya menggunakan pustaka sumber terbuka dalam kasus saya, saya sudah memiliki kode untuk membangun file pdb.

TAPI, defaultnya adalah menamai semua file PDF dengan hal yang sama: vc100.pdb dalam kasus saya. Karena Anda memerlukan .pdb untuk setiap .lib, ini menimbulkan masalah, terutama jika Anda menggunakan sesuatu seperti ImageMagik, yang membuat sekitar 20 file .lib statis. Anda tidak dapat memiliki 20 file lib dalam satu direktori (yang direferensikan oleh linker aplikasi Anda untuk ditautkan di perpustakaan) dan memiliki semua 20 file .pdb yang disebut sama.

Solusi saya adalah pergi dan membangun kembali file perpustakaan statis saya, dan mengkonfigurasi VS2010 untuk memberi nama file .pdb sehubungan dengan PROYEK tersebut. Dengan cara ini, setiap .lib mendapatkan nama .pdb yang serupa, dan Anda dapat meletakkan semua LIB dan PDB dalam satu direktori untuk digunakan oleh proyek Anda.

Jadi untuk konfigurasi "Debug", saya mengedit:

Properti-> Properti Konfigurasi -> C / C ++ -> File Output -> Nama File Database Program dari

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

menjadi nilai berikut:

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

Sekarang daripada di suatu tempat di direktori perantara, file .pdb ditulis ke direktori output, di mana file .lib juga sedang ditulis, DAN yang terpenting, mereka diberi nama dengan akhiran nama proyek D + . Ini berarti setiap proyek perpustakaan menghasilkan proyek .lib dan .pdb khusus proyek.

Saya sekarang dapat menyalin semua file rilis .lib saya, file debug .lib saya dan file debug .pdb ke satu tempat di sistem pengembangan saya, dan proyek yang menggunakan pustaka pihak ketiga dalam mode debug, memiliki pdb file yang dibutuhkan dalam mode debug.

Minok
sumber
2
Saya akan mengatakan ini adalah yang jawaban atas pertanyaan. Saran PATCHING THE LINKER yang mengandung banyak jawaban adalah konyol. Bahkan jika Microsoft "salah" tentang membuat peringatan ini tidak dapat diabaikan.
Tamás Szelei
3
Ini adalah jawaban yang tepat JIKA Anda menyusun perpustakaan dari sumber. Tetapi beberapa program memiliki ketergantungan pada pustaka komersial yang tidak menyertakan file .pdb, jadi membuat file .pdb untuk mereka bukanlah suatu pilihan.
Bryce Wagner
3

Saya menduga / mengabaikan adalah opsi link.exe VC6. untuk linker VS2005 dan VS2008 tidak ada opsi yang didokumentasikan / abaikan, tetapi linker terlihat mengabaikan opsi "/ abaikan: XXX", tidak ada kesalahan dan tidak ada efek.

zhaorufei
sumber
2
Faktanya, disarankan untuk tidak mengabaikan peringatan linker, sehingga flag abaikan dinonaktifkan setelah VC6: bytes.com/topic/net/answers/…
Gyuri
/ ignore dapat digunakan lagi di VS2013.
Fernando Gonzalez Sanchez
1

File PDB biasanya digunakan untuk menyimpan informasi debug. Peringatan ini mungkin disebabkan karena file vc80.pdbtidak ditemukan saat menautkan file objek target. Baca entri MSDN di LNK4099 di sini .

Alternatifnya, Anda dapat menonaktifkan pembuatan informasi debug dari Project Properties> Linker> Debugging> Generate Debug Info field.

dirkgently
sumber
3
Menonaktifkan info debug akan memecahkan peringatan linker, tetapi kemudian breakpoint tidak berfungsi tanpa informasi debug. Itu tidak terlalu berguna bagi saya.
Ashwin Nanjappa
2
Mematikan peringatan bukanlah hal yang benar untuk dilakukan. Perbaiki mereka. Anda perlu mencari pdb dan memastikan bahwa itu akan disalin ke lokasi yang tepat.
dirkgently
Sigh, itu benar! Sayangnya dalam kasus ini, saya tidak dapat menemukan pdb itu.
Ashwin Nanjappa
1
vc80.pdb hanyalah nama pdb default untuk vc8. Peringatan ini berarti tidak ada informasi debug yang tersedia untuk perpustakaan CGAL. Aman untuk diabaikan.
JoeG
1

EDIT: jangan gunakan vc80 / Visual Studio 2005, tapi versi Visual Studio 2008 / vc90 dari perpustakaan CGAL (mungkin dari sini ).

Peringatan Alat Linker LNK4099 :

Anda juga dapat mengkompilasi dengan / Z7, sehingga pdb tidak perlu digunakan, atau hapus opsi / DEBUG linker jika Anda tidak memiliki file .pdb untuk objek yang Anda tautkan.

kapak.
sumber
2
Terima kasih. Mengompilasi dengan / Z7 masih meminta file .pdb dari perpustakaan CGAL. / DEBUG memecahkan peringatan linker, tetapi kemudian breakpoint tidak berfungsi tanpa informasi debug.
Ashwin Nanjappa
1

Anda tidak dapat menonaktifkan peringatan linker 4099, seperti yang dikatakan @John Weldon.

Anda harus membangun kembali perpustakaan dengan beberapa perubahan konfigurasi proyek. Anda memiliki beberapa opsi:

  • Simpan file PDB dengan informasi debug di folder yang sama tempat Anda menyimpan file .lib. Setel nilai "$ (OutDir) $ (TargetName) .pdb" ke Properties-> C / C ++ -> Output Files-Program Database File Name
  • Simpan informasi debug dalam file .lib. Setel nilai "C7 compatible (/ Z7)" ke Properties-> C / C ++ -> General-> Debug Information Format
  • Nonaktifkan informasi debug pembuatan untuk pustaka ini. Hapus nilai dari Properties-> C / C ++ -> General-> Debug Information Format
KindDragon
sumber