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 / ละเว้น: 4099 ทำงานได้ดี

/ ไม่สนใจ: 4099 ทำงานได้ดีที่นี่กับ VS2008
ทอม

/ignore:4099ทำงานได้ดีใน Visual Studio 10 พร้อม C ++ ฉันได้รับคำเตือนLNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)และจัดการลบออกด้วยวิธีนี้
Manolete


3
VS2013 ยอมรับ / เพิกเฉย: 4099 ก็ดี :)
mlvljr

คำตอบ:


101

เพิ่มสิ่งต่อไปนี้เป็นตัวเลือกตัวเชื่อมโยงเพิ่มเติม:

 /ignore:4099

ใน Properties-> Linker-> Command Line


5
ฉันไม่คิดว่า / เพิกเฉยมีอยู่จริง ข้อผิดพลาดยังคงแสดงอยู่และ / เพิกเฉยไม่ได้รับการบันทึกไว้ใน MSDN ฉันกำลังพยายามปิดใช้งาน 4075 สำหรับ "คำเตือน LNK4075: ละเว้น" / EDITANDCONTINUE "เนื่องจากข้อกำหนด" / INCREMENTAL: NO ""
Nick Desjardins

1
/ IGNORE ไม่มีเอกสาร แต่พร้อมใช้งาน ดูconnect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela

5
ไม่ทำงานสำหรับคำเตือน 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon

7
คุณสามารถใช้ / ละเว้น: 4099 เป็นธงตัวเชื่อม แต่มีสิ่งที่จับได้ น่าเสียดายที่ Microsoft ตัดสินใจให้ 4099 เป็นคำเตือนที่ไม่สามารถเพิกเฉยได้ดังนั้นคุณต้องแก้ไข link.exe ฟังดูบ้า แต่ไม่มีทางอื่น รายละเอียดเพิ่มเติมที่นี่: Bottledlight.com/docs/lnk4099.html ฉันใช้ HxD เป็นตัวแก้ไขฐานสิบหกและการปฏิบัติตามคำอธิบายในหน้านั้นทำงานได้ดีกับ VS10 คำสั่งซื้อยังคงเป็น 4088, 4099, 4105
Andreas Haferburg

2
ทำงานบน VS 2015 (โครงการใช้ชุดเครื่องมือ VS2013 ไม่แน่ใจว่าสร้างความแตกต่างหรือไม่)
Assimilater

50

อัปเดต 2018-10-16

ตามรายงานเมื่อ VS 2013 คำเตือนนี้สามารถปิดใช้งานได้ ดูความคิดเห็นของ @Mark Ransom

คำตอบเดิม

คุณไม่สามารถปิดคำเตือนเฉพาะนั้นได้

อ้างอิงจากGeoff Chappellคำเตือน 4099 ถือว่าเป็นเรื่องสำคัญเกินกว่าที่จะเพิกเฉยแม้ว่าจะใช้ร่วมกับ / wx (ซึ่งจะถือว่าคำเตือนเป็นข้อผิดพลาดและละเว้นคำเตือนที่ระบุในสถานการณ์อื่น ๆ )

นี่คือข้อความที่เกี่ยวข้องจากลิงค์:

ไม่ใช่คำเตือนที่ไม่น่าไว้วางใจ

สำหรับหมายเลขคำเตือนบางรายการจะยอมรับข้อกำหนดในตัวเลือก / ละเว้น แต่ไม่จำเป็นต้องดำเนินการ หากคำเตือนเกิดขึ้นในขณะที่ตัวเลือก / wx ไม่ทำงานข้อความเตือนจะยังคงแสดงอยู่ แต่ถ้าตัวเลือก / wx ทำงานอยู่คำเตือนจะถูกละเว้น ราวกับว่าคำเตือนนั้นมีความสำคัญมากพอที่จะลบล้างความพยายามที่จะเพิกเฉยต่อคำเตือน แต่ไม่ใช่หากผู้ใช้ตั้งราคาไว้สูงเกินไปสำหรับคำเตือนที่ไม่ใส่ใจ

หมายเลขคำเตือนต่อไปนี้ได้รับผลกระทบ:

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

เขาไม่ได้พูดว่า "คำเตือน 4099 สำคัญเกินกว่าจะเพิกเฉย"; เขาอนุมานได้ว่ามันไม่สามารถปิดได้ (สังเกตที่นี่เนื่องจากไม่มีข้อมูลเพิ่มเติมที่ลิงค์นั้น)
Ben M

อัปเดตเพื่อตอบข้อกังวลของคุณ @BenM
John Weldon

1
คำตอบนี้เก่าแล้วการปิดใช้งานคำเตือน 4099 ทำงานได้ดีสำหรับฉันใน VS2017 จากความคิดเห็นที่นี่สามารถปิดการใช้งานได้อาจเริ่มต้นด้วย VS2013
Mark Ransom

10

(สำหรับเร็กคอร์ดและก่อนที่เธรดจะหายไปในฟอรัม msdn) คุณไม่สามารถปิดใช้งานคำเตือน (อย่างน้อยภายใต้ VS2010) เนื่องจากอยู่ในรายการคำเตือนที่ไม่สามารถปิดใช้งานได้ (ดังนั้น / wd4099 จะไม่ทำงาน) แต่สิ่งที่คุณทำได้แทนคือ patch link.exe (โดยปกติคือ C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) เพื่อลบออกจากรายการดังกล่าว ฉันรู้ว่าเสียงเหมือนแจ็คแฮมเมอร์ มันใช้งานได้

ตัวอย่างเช่นหากคุณต้องการลบคำเตือนสำหรับ 4099 ให้เปิด link.exe ด้วยตัวแก้ไข hex goto บรรทัด 15A0 ซึ่งอ่าน 03 10 (endian เล็กน้อยสำหรับ 4099) และแทนที่ด้วย FF 00 (ซึ่งไม่มีอยู่)


5
คุณควรมองหาลำดับ F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 เป็นคำคู่ 32 บิตใน endian น้อย) มันเหมือนกันใน amd64 / link.exe
Andreas Haferburg

8

เพื่อประโยชน์ของผู้อื่นแม้ว่าฉันจะรวมสิ่งที่ฉันทำ

เนื่องจากคุณไม่สามารถรับ Visual Studio (2010 ในกรณีของฉัน) เพื่อเพิกเฉยต่อคำเตือน LNK4204 แนวทางของฉันคือให้สิ่งที่ต้องการ: ไฟล์ pdb เนื่องจากฉันใช้ไลบรารีโอเพนซอร์สในกรณีของฉันฉันมีรหัสที่สร้างไฟล์ pdb อยู่แล้ว

แต่ค่าเริ่มต้นคือตั้งชื่อไฟล์ PDF ทั้งหมดเหมือนกัน: vc100.pdb ในกรณีของฉัน เนื่องจากคุณต้องการ. pdb สำหรับ. lib แต่ละไฟล์สิ่งนี้จะสร้างปัญหาโดยเฉพาะอย่างยิ่งถ้าคุณใช้บางอย่างเช่น ImageMagik ซึ่งสร้างไฟล์. lib แบบคงที่ประมาณ 20 ไฟล์ คุณไม่สามารถมีไฟล์ lib 20 ไฟล์ในไดเร็กทอรีเดียว (ซึ่งตัวเชื่อมโยงของแอปพลิเคชันของคุณอ้างถึงลิงก์ในไลบรารี) และมีไฟล์. pdb ทั้งหมด 20 ไฟล์ที่เรียกว่าสิ่งเดียวกัน

วิธีแก้ปัญหาของฉันคือไปและสร้างไฟล์ไลบรารีแบบคงที่ของฉันใหม่และกำหนดค่า VS2010 เพื่อตั้งชื่อไฟล์. ด้วยวิธีนี้. lib แต่ละตัวจะได้รับชื่อ. pdb ที่คล้ายกันและคุณสามารถใส่ LIB และ PDB ทั้งหมดในไดเร็กทอรีเดียวเพื่อให้โปรเจ็กต์ของคุณใช้

ดังนั้นสำหรับการกำหนดค่า "ดีบัก" ฉันจึงแก้ไข:

คุณสมบัติ -> คุณสมบัติการกำหนดค่า -> C / C ++ -> ไฟล์เอาต์พุต -> ชื่อไฟล์ฐานข้อมูลโปรแกรมจาก

$ (IntDir) VC $ (PlatformToolsetVersion) .pdb

เป็นค่าต่อไปนี้:

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

ตอนนี้มากกว่าที่ใดที่หนึ่งในไดเรกทอรีกลางไฟล์ .pdb ถูกเขียนไปยังไดเรกทอรีออกที่ไฟล์ .LIB ยังมีการเขียนและที่สำคัญที่สุดคือพวกเขาจะถูกตั้งชื่อมีคำต่อท้ายของ D + A ชื่อโครงการ ซึ่งหมายความว่าโปรเจ็กต์ไลบรารีแต่ละโปรเจ็กต์จะสร้างโปรเจ็กต์. lib และโปรเจ็กต์. pdb

ตอนนี้ฉันสามารถคัดลอกไฟล์. lib ทั้งหมดของฉันไฟล์ debug .lib และไฟล์ debug .pdb ลงในที่เดียวในระบบการพัฒนาของฉันและโปรเจ็กต์ที่ใช้ไลบรารีของบุคคลที่สามนั้นในโหมดดีบักมี pdb ไฟล์ที่ต้องการในโหมดดีบัก


2
ผมว่านี่เป็นคำตอบของคำถาม คำแนะนำของ PATCHING THE LINKER ที่มีหลายคำตอบคือ asinine แม้ว่า Microsoft จะ "ผิด" เกี่ยวกับการทำให้คำเตือนนี้ไม่สามารถเพิกเฉยได้
Tamás Szelei

3
นี่คือคำตอบที่เหมาะสมหากคุณกำลังรวบรวมไลบรารีจากแหล่งที่มา แต่บางโปรแกรมมีการพึ่งพาไลบรารีเชิงพาณิชย์ซึ่งไม่มีไฟล์. pdb ดังนั้นการสร้างไฟล์. pdb สำหรับพวกเขาจึงไม่ใช่ทางเลือก
Bryce Wagner

3

ฉันสงสัยว่า / เพิกเฉยเป็นตัวเลือก VC6 link.exe สำหรับตัวเชื่อมโยง VS2005 และ VS2008 ไม่มีตัวเลือกที่เป็นเอกสาร / ละเว้น แต่ผู้เชื่อมโยงมองข้ามตัวเลือก "/ ไม่สนใจ: XXX" ไม่มีข้อผิดพลาดและไม่มีผลใด ๆ


2
ในความเป็นจริงมันโกรธที่จะไม่เพิกเฉยต่อคำเตือนของตัวเชื่อมโยงดังนั้นการตั้งค่าสถานะการเพิกเฉยจึงถูกปิดใช้งานหลังจาก VC6: bytes.com/topic/net/answers/…
Gyuri

/ ไม่สนใจสามารถใช้ได้อีกครั้งใน VS2013
Fernando Gonzalez Sanchez

1

โดยทั่วไปไฟล์ PDB จะใช้เพื่อจัดเก็บข้อมูลการดีบัก คำเตือนนี้เกิดขึ้นเนื่องจากvc80.pdbไม่พบไฟล์เมื่อเชื่อมโยงไฟล์อ็อบเจ็กต์เป้าหมาย อ่านรายการ MSDN ใน LNK4099 ที่นี่

หรือคุณสามารถปิดการสร้างข้อมูลการดีบักได้จากฟิลด์คุณสมบัติโครงการ> ตัวเชื่อมโยง> การดีบัก> สร้างข้อมูลการดีบัก


3
การปิดข้อมูลการดีบักจะแก้คำเตือนของตัวเชื่อมโยง แต่เบรกพอยต์จะไม่ทำงานหากไม่มีข้อมูลการดีบัก นั่นไม่ค่อยมีประโยชน์สำหรับฉัน
Ashwin Nanjappa

2
การปิดคำเตือนไม่ใช่สิ่งที่ควรทำ แก้ไข คุณต้องหา pdb และดูว่ามันถูกคัดลอกไปยังตำแหน่งที่เหมาะสม
ช้าที่สุด

เฮ้อนั่นคือเรื่องจริง! น่าเศร้าในกรณีนี้ฉันไม่พบ pdb นั้น
Ashwin Nanjappa

1
vc80.pdb เป็นเพียงชื่อ pdb เริ่มต้นสำหรับ vc8 คำเตือนนี้หมายความว่าไม่มีข้อมูลการดีบักสำหรับไลบรารี CGAL มันปลอดภัยที่จะเพิกเฉย
JoeG

1

แก้ไข: อย่าใช้ vc80 / Visual Studio 2005 แต่ไลบรารี CGAL ของ Visual Studio 2008 / vc90 (อาจมาจาก ที่นี่ )

คำเตือนเครื่องมือ Linker LNK4099 :

คุณยังสามารถคอมไพล์ด้วย / Z7 ได้ดังนั้นจึงไม่จำเป็นต้องใช้ pdb หรือลบอ็อพชัน / DEBUG linker ถ้าคุณไม่มีไฟล์. pdb สำหรับอ็อบเจ็กต์ที่คุณกำลังเชื่อมโยง


2
ขอบคุณ การคอมไพล์ด้วย / Z7 ยังคงขอไฟล์. pdb ของไลบรารี CGAL / DEBUG แก้ไขคำเตือนตัวเชื่อมโยง แต่เบรกพอยต์จะไม่ทำงานหากไม่มีข้อมูลการดีบัก
Ashwin Nanjappa

1

คุณไม่สามารถปิดใช้งานคำเตือนตัวเชื่อมโยง 4099 ตามที่ @John Weldon กล่าว

คุณควรสร้างไลบรารีใหม่ด้วยการเปลี่ยนแปลงการกำหนดค่าโครงการ คุณมีหลายทางเลือก:

  • บันทึกไฟล์ PDB พร้อมข้อมูลการดีบักเป็นโฟลเดอร์เดียวกับที่คุณบันทึกไฟล์. lib ตั้งค่า "$ (OutDir) $ (TargetName) .pdb" เป็น Properties-> C / C ++ -> ชื่อไฟล์ฐานข้อมูลไฟล์โปรแกรมเอาต์พุต
  • บันทึกข้อมูลการดีบักในไฟล์. lib ตั้งค่า "C7 compatible (/ Z7)" เป็น Properties-> C / C ++ -> General-> Debug Information Format
  • ปิดใช้งานการสร้างข้อมูลการดีบักสำหรับไลบรารีนี้ ลบค่าออกจาก Properties-> C / C ++ -> General-> Debug Information Format
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.