Visual C ++: Belirli bağlayıcı uyarıları nasıl devre dışı bırakılır?


118

CGAL'den bir kitaplık kullanıyorum ve kod derlememin bağlanma aşamasında bu formda birçok bağlantı uyarısı üretiyor:

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 altında bu belirli bağlayıcı uyarısını nasıl kapatırım?

Kullandığım harici (CGAL) kitaplık üzerinde herhangi bir denetime sahip olmadığımı unutmayın. Harici kitaplığı yeniden derlemek istemiyorum / istemiyorum. Bu nedenle, mesajların benim tarafımdan düzeltilmesi gerekiyor.


1
VS2005 için / yok say: 4099 iyi çalışıyor.

/ ignore: 4099 burada VS2008 ile sorunsuz çalışıyor.
Tom

/ignore:4099C ++ ile Visual Studio 10'da sorunsuz çalışır. Uyarıyı aldım ve LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)bu şekilde kaldırmayı başardım.
Manolete


3
VS2013 kabul eder / görmezden gelir: 4099 gayet iyi :)
mlvljr

Yanıtlar:


101

Aşağıdakileri ek bir bağlayıcı seçeneği olarak ekleyin:

 /ignore:4099

Bu Özellikler-> Bağlayıcı-> Komut Satırında


5
Var olduğunu düşünmüyorum / görmezden gelmiyorum. Hatalar hala listelenmektedir ve / ignore, MSDN'de belgelenmemiştir. 4075'i "LNK4075 uyarısı için:" / ARTIRICI: HAYIR "özelliği nedeniyle" / EDITANDCONTINUE "yoksayarak devre dışı bırakmaya çalışıyorum."
Nick Desjardins

1
/ IGNORE belgelenmemiştir ancak kullanılabilir. Bkz. Connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela


7
Kullanabilir / yok sayabilirsiniz: 4099'u bağlayıcı bayrağı olarak kullanabilirsiniz, ancak bir yakalama var. Ne yazık ki Microsoft, 4099'u göz ardı edilemeyecek bir uyarı yapmaya karar verdi, bu nedenle link.exe dosyasını düzeltmeniz gerekiyor. Kulağa çılgınca geliyor, ancak başka yolu yok. Daha fazla ayrıntı burada: bottledlight.com/docs/lnk4099.html HxD'yi onaltılık düzenleyici olarak kullandım ve bu sayfadaki açıklamayı takiben VS10 ile iyi çalıştı. Sipariş hala 4088, 4099, 4105.
Andreas Haferburg

2
VS 2015 üzerinde çalışıyor (proje VS2013 araç setini kullanıyor, bunun bir fark yaratıp yaratmayacağından emin değilim)
Assimilater

50

2018-10-16 Güncellemesi

Bildirildiğine göre, VS 2013 itibariyle bu uyarı devre dışı bırakılabilir. @Mark Ransom tarafından yapılan yoruma bakın.

Orijinal Cevap

Bu özel uyarıyı devre dışı bırakamazsınız.

Geoff Chappell'e göre 4099 uyarısı, / wx ile birlikte kullanılsa bile göz ardı edilemeyecek kadar önemliymiş gibi değerlendirilir (bu, uyarıları hata olarak ele alır ve diğer durumlarda belirtilen uyarıyı yok sayar)

İşte bağlantıdaki ilgili metin:

Pek Önemsiz Uyarılar Değil

Bazı uyarı numaraları için, / yok say seçeneğindeki belirtim kabul edilir, ancak buna göre hareket edilmesi gerekmez. Uyarı / wx seçeneği etkin değilken meydana gelirse, uyarı iletisi yine de görüntülenir, ancak / wx seçeneği etkinse, uyarı yok sayılır. Sanki uyarının, onu görmezden gelme girişimini geçersiz kılacak kadar önemli olduğu düşünülüyor, ancak kullanıcı önemsiz uyarılara çok yüksek bir fiyat koymuşsa değil.

Aşağıdaki uyarı numaraları etkilenir:

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

"4099 uyarısı görmezden gelinemeyecek kadar önemli" demiyor; bunu kapatılamayacağı gerçeğinden çıkarıyor. (Bu bağlantıda fazladan sıfır bilgi olmadığı için burada belirtilmiştir.)
Ben M

Endişenizi gidermek için güncellendi @BenM
John Weldon

1
Bu cevap eski , 4099 uyarısını devre dışı bırakmak VS2017'de benim için iyi çalıştı. Buradaki yorumlardan, muhtemelen VS2013 ile başlayarak devre dışı bırakılabileceği anlaşılıyor.
Mark Ransom

10

(Kayıt için ve msdn forumlarında ileti dizisi kaybolmadan önce) Uyarıyı devre dışı bırakamazsınız (en azından VS2010 altında), çünkü devre dışı bırakılamayan uyarılar listesinde (yani / wd4099 çalışmayacaktır) , ancak bunun yerine yapabileceğiniz şey, söz konusu listeden kaldırmak için yama link.exe'dir (genellikle C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe). Bir kırıcıya benziyor, biliyorum. Yine de çalışıyor.

Örneğin, 4099 uyarısını kaldırmak istiyorsanız, link.exe'yi bir onaltılık düzenleyiciyle açın, 03 10 (4099 için küçük endian) yazan 15A0 satırına gidin ve FF 00 (mevcut olmayan) ile değiştirin.


5
F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (little endian'da 32 bit çift kelime olarak 4088, 4099, 4105) dizisini aramalısınız. Amd64 / link.exe'de de durum aynıdır.
Andreas Haferburg

8

Başkalarının yararı için, yaptıklarımı da dahil ettim.

Visual Studio'nun (benim durumumda 2010) LNK4204 uyarılarını göz ardı etmesini sağlayamadığınız için, benim yaklaşımım ona istediğini vermekti: pdb dosyaları. Benim durumumda açık kaynak kitaplıkları kullandığım için, zaten pdb dosyalarını oluşturan koda sahibim.

ANCAK, varsayılan, tüm PDF dosyalarını aynı şekilde adlandırmaktır: benim durumumda vc100.pdb. Her bir .lib için bir .pdb'ye ihtiyacınız olduğundan, bu özellikle yaklaşık 20 statik .lib dosyası oluşturan ImageMagik gibi bir şey kullanıyorsanız bir sorun yaratır. Bir dizinde (uygulamanızın bağlayıcısının kütüphanelerde bağlantı kurmak için başvurduğu) 20 lib dosyasına sahip olamazsınız ve 20 .pdb dosyasının tümüne aynı adı veremezsiniz.

Çözümüm gidip statik kitaplık dosyalarımı yeniden oluşturmak ve VS2010'u .pdb dosyasını PROJE ile ilgili olarak adlandıracak şekilde yapılandırmaktı. Bu şekilde, her bir .lib benzer şekilde adlandırılmış bir .pdb alır ve projenizin kullanması için tüm LIB'leri ve PDB'leri tek bir dizine koyabilirsiniz.

Bu yüzden "Hata Ayıklama" yapılandırması için şunları düzenledim:

Özellikler-> Yapılandırma Özellikleri -> C / C ++ -> Çıktı Dosyaları -> Program Veritabanı Dosya Adı dan

$ (IntDir) vc $ (PlatformToolsetVersion) .Pdb

aşağıdaki değer olmalıdır:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (ProjeAdı) .Pdb

Artık ara dizinde bir yer yerine .pdb dosyaları, .lib dosyalarının da yazıldığı çıktı dizinine yazılır ve en önemlisi, D + proje adı sonekiyle adlandırılır . Bu, her kütüphane projesinin bir proje .lib ve projeye özel .pdb ürettiği anlamına gelir .

Artık tüm sürüm .lib dosyalarımı, hata ayıklama .lib dosyalarımı ve hata ayıklama .pdb dosyalarını geliştirme sistemimde tek bir yere kopyalayabiliyorum ve hata ayıklama modunda bu 3. taraf kitaplığını kullanan proje pdb'ye sahip hata ayıklama modunda ihtiyaç duyduğu dosyalar.


2
Bunun olduğunu söyleyebilirim sorunun cevabı. Birçok cevabın içerdiği BAĞLANTIYI YAMA önerisi aptalcadır. Microsoft bu uyarıyı göz ardı edilemez hale getirme konusunda "yanlış" olsa bile.
Tamás Szelei

3
Kitaplığı kaynaktan derliyorsanız bu doğru cevaptır. Ancak bazı programların .pdb dosyalarını içermeyen ticari kitaplıklara bağımlılıkları vardır, bu nedenle onlar için bir .pdb dosyası oluşturmak bir seçenek değildir.
Bryce Wagner

3

Bir VC6 link.exe seçeneğinden şüpheleniyorum / yok sayıyorum. VS2005 ve VS2008'in bağlayıcısı için belgelenmiş / yok sayma seçeneği yoktur, ancak bağlayıcı görünüyor sadece "/ ignore: XXX" seçeneğini görmezden gelir, hata ve etkisi yoktur.


2
Aslında, bağlayıcı uyarılarını görmezden gelmemek çok üzüldü
Gyuri

/ ignore, VS2013'te yeniden kullanılabilir.
Fernando Gonzalez Sanchez

1

PDB dosyası genellikle hata ayıklama bilgilerini depolamak için kullanılır. Bu uyarının nedeni büyük olasılıkla vc80.pdbhedef nesne dosyası bağlanırken dosyanın bulunamamasıdır. LNK4099 üzerindeki MSDN girişini buradan okuyun .

Alternatif olarak, Proje Özellikleri> Bağlayıcı> Hata Ayıklama> Hata Ayıklama Bilgilerini Oluştur alanından hata ayıklama bilgisi oluşturmayı kapatabilirsiniz.


3
Hata ayıklama bilgisinin kapatılması bağlayıcı uyarılarını çözer, ancak daha sonra kesme noktaları hata ayıklama bilgileri olmadan çalışmaz. Bu benim için pek kullanışlı değil.
Ashwin Nanjappa

2
Uyarıları kapatmak asla yapılacak doğru şey değildir. Onları tamir etmek. Pdb'yi bulmanız ve doğru yere kopyalanmasını sağlamanız gerekir.
Dirkgently

Bu doğru! Ne yazık ki bu durumda o pdb'yi bulamıyorum.
Ashwin Nanjappa

1
vc80.pdb, vc8 için yalnızca varsayılan pdb adıdır. Bu uyarı, CGAL kitaplığı için kullanılabilir hata ayıklama bilgisi olmadığı anlamına gelir. Görmezden gelmek güvenlidir.
JoeG

1

DÜZENLEME: vc80 / Visual Studio 2005, ama CGAL kütüphanesinin Visual Studio 2008 / vc90 sürümlerini (belki kullanmayın dan burada ).

Bağlayıcı Araçları Uyarısı LNK4099 :

Ayrıca / Z7 ile de derleyebilirsiniz, böylece pdb'nin kullanılması gerekmez veya bağladığınız nesneler için .pdb dosyalarınız yoksa / DEBUG bağlayıcı seçeneğini kaldırabilirsiniz.


2
Teşekkürler. / Z7 ile derlemek hala CGAL kitaplığının .pdb dosyasını istiyor. / DEBUG, bağlayıcı uyarılarını çözer, ancak sonra kesme noktaları hata ayıklama bilgileri olmadan çalışmaz.
Ashwin Nanjappa

1

@John Weldon'un dediği gibi 4099 bağlayıcı uyarısını devre dışı bırakamazsınız.

Bazı proje yapılandırma değişiklikleri ile kitaplığı yeniden oluşturmalısınız. Birkaç seçeneğiniz var:

  • PDB dosyasını hata ayıklama bilgileriyle kaydetme, .lib dosyasını kaydettiğiniz klasörle aynıdır. "$ (OutDir) $ (HedefAdı) .pdb" değerini Özellikler-> C / C ++ -> Çıktı Dosyaları-Program Veritabanı Dosya Adı olarak ayarlayın
  • Hata ayıklama bilgilerini .lib dosyasına kaydedin. "C7 uyumlu (/ Z7)" değerini Özellikler-> C / C ++ -> Genel-> Hata Ayıklama Bilgi Formatı olarak ayarlayın
  • Bu kitaplık için oluşturma hata ayıklama bilgilerini devre dışı bırakın. Değerleri Özellikler-> C / C ++ -> Genel-> Hata Ayıklama Bilgi Biçimi'nden kaldırın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.