โปรแกรมไม่สามารถเริ่มทำงานได้เนื่องจาก libgcc_s_dw2-1.dll หายไป


167

ฉันได้สร้างโปรแกรมอย่างง่ายใน C ++ ด้วย Code :: Blocks

ถ้าฉันเรียกใช้จาก Code :: Blocks มันทำงานได้อย่างถูกต้อง แต่ถ้าฉันรันโดยดับเบิลคลิกที่ไฟล์ปฏิบัติการหน้าต่างจะปรากฏขึ้นพร้อมกับข้อความนี้:

โปรแกรมไม่สามารถเริ่มทำงานได้เนื่องจาก libgcc_s_dw2-1.dll หายไปจากคอมพิวเตอร์ของคุณ
ลองติดตั้งโปรแกรมใหม่เพื่อแก้ไขปัญหานี้

ดังนั้นปัญหาคืออะไร ฉันต้องทำอย่างไรเพื่อแก้ไข

คำตอบ:


196

ฉันเชื่อว่านี่เป็นปัญหาคอมไพเลอร์ MinGW / gcc มากกว่าการตั้งค่า Microsoft Visual Studio

libgcc_s_dw2-1.dllควรจะอยู่ในไดเรกทอรีถังคอมไพเลอร์ของ คุณสามารถเพิ่มไดเรกทอรีนี้ลงในตัวแปรสภาพแวดล้อม PATH ของคุณสำหรับการเชื่อมโยงรันไทม์หรือคุณสามารถหลีกเลี่ยงปัญหาได้โดยเพิ่ม "-static-libgcc -static-libstdc ++" ลงในแฟล็กคอมไพเลอร์ของคุณ

หากคุณวางแผนที่จะแจกจ่ายไฟล์ปฏิบัติการมันอาจจะเหมาะสมที่สุด หากคุณวางแผนที่จะรันบนเครื่องของคุณเองการเปลี่ยนแปลงตัวแปรสภาพแวดล้อม PATH เป็นตัวเลือกที่น่าสนใจ (ช่วยลดขนาดของไฟล์ปฏิบัติการ)

Updated:

ตามความคิดเห็นจาก Greg Treleaven (ดูความคิดเห็นด้านล่าง) ฉันกำลังเพิ่มลิงก์ไปยัง:

[ภาพหน้าจอของ Code :: บล็อก "ตัวเลือกการสร้างโครงการ"]

[ตัวเลือกลิงก์ GNU gcc]

การอภิปรายหลังรวมถึง-static-libgccและ-static-libstdc++ตัวเลือกลิงเกอร์


ฉันมีปัญหาเช่นเดียวกับ @xRobot และฉันไม่พบที่ใดก็ได้ในการเพิ่มรายการลงในธงคอมไพเลอร์ดังนั้นฉันจึงลองเพิ่มลงในตัวเลือกอื่น ๆ จากนั้นเลือกตัวเลือก Linker และข้อความแสดงข้อผิดพลาดยังคงเกิดขึ้น มีอะไรผิดปกติกับสิ่งที่ฉันทำหรือไม่?
เกร็ก Treleaven

@Greg Treleaven: เพียงเพื่อความชัดเจนคุณกำลังสร้างปฏิบัติการด้วย Code :: Block มันทำงานได้ตามที่คาดไว้ใน IDE แต่รายงานข้อผิดพลาด "ไม่สามารถเริ่มได้เพราะ libgcc_s_dw2-1.dll หายไป" เมื่อคุณพยายามเรียกใช้ นอก IDE คุณตรวจสอบไดเรกทอรี bin ของคอมไพเลอร์และใช่แล้ว DLL นี้มีอยู่จริง คุณกำลังพยายามแก้ไขปัญหาด้วยการทำลิงค์แบบคงที่ซึ่งดึงในรหัสที่รวบรวมจากไลบรารีดังนั้น DLL (การเชื่อมโยงรันไทม์) ไม่จำเป็น แต่มันไม่ทำงาน คำแนะนำสองข้อ: ทำการสร้างใหม่ทั้งหมด (ตัวเลือกการเปลี่ยนอาจไม่ทำให้เกิดการสร้างใหม่) และลองเพิ่มตัวแปร PATH
hardmath

@ ฮาร์ดแมท: ยังไม่ทำงานหลังจากทำการสร้างใหม่ทั้งหมดดังนั้นฉันคิดว่าฉันจะต้องใช้วิธีการอย่างหนึ่งในการแก้ไขปัญหานี้ ขอบคุณสำหรับการช่วยเหลือ.
เกร็ก Treleaven

@Greg Treleaven: เหตุผลที่ลองเพิ่มไดเรกทอรีช่องเก็บของคอมไพเลอร์ใน PATH ของคุณคือการแสดง (หากทำให้สิ่งต่าง ๆ ทำงานได้) ว่าไฟล์ปฏิบัติการยังคงถูกสร้างขึ้นเพื่อเชื่อมโยงรันไทม์ของไลบรารีมาตรฐาน (DLL) ฉันคิดว่าปัญหาคือว่าและเราจำเป็นต้องค้นหา (ถ้าคุณต้องการที่จะทำการเชื่อมโยงคงที่ของรหัสห้องสมุด) ที่ที่จะวางธงคอมไพเลอร์
hardmath

4
การอภิปรายนี้อย่างต่อเนื่อง (และจะแก้ไขได้) ที่นี่
David C

37

ใน Eclipse คุณจะพบได้ภายใต้คุณสมบัติโครงการ> C / C ++ Build> การตั้งค่า> MinGW C ++ Linker> อื่น ๆ

คุณต้องเพิ่มลงใน "ตัวเชื่อมโยงธง" ที่ด้านบน ไม่มีที่ไหนอีกแล้ว จากนั้นสร้างใหม่

ภาพหน้าจอของคุณสมบัติ Eclipse

ฉันได้พบว่าการเชื่อมโยงแบบคงที่จะขยายขนาดได้ถึง 1,400kb แม้ว่าจะเป็นการเพิ่มประสิทธิภาพก็ตาม มันมีขนาดใหญ่กว่า 277kb เมื่อเทียบกับเพียงแค่คัดลอกไฟล์ DLL ที่ใช้ร่วมกัน มันใหญ่กว่า 388kb เช่นกันหลังจากทุกอย่าง UPXing แพ้ / แพ้มากที่นี่ เพียงรวม DLLs ที่ผู้ใช้สามารถตัดสินใจที่จะลบหรือไม่ถ้าพวกเขาติดตั้งที่อื่น


1
มีวิธีหลีกเลี่ยงการเพิ่มการตั้งค่าตัวเชื่อมโยงในแต่ละโครงการที่สร้างขึ้นใหม่หรือไม่
Roger Ng

เรียนผู้อ่าน: โปรดทราบตัวเลือกที่เพิ่มในภาพ วิธีนี้ใช้ได้ผล สิ่งนี้ช่วยในการอ้างอิง: orfe.princeton.edu/help/article-296
PALEN

10

รหัส :: บล็อก: เพิ่ม '-static' ใน settings-> compiler-> Linker settings-> ตัวเลือก linker อื่น ๆ


1
มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันเกี่ยวกับ dll "ที่หายไป" ต่อชื่อเรื่องมันเร็วและง่ายมากฉันขอแนะนำให้ไปที่นี้ก่อน
Paul Connolly

ทางออกที่ดีที่สุด!
iyy0v

6

ค้นหา dll นั้นบนพีซีของคุณและคัดลอกไปยังไดเรกทอรีเดียวกันกับไฟล์ที่รันได้ของคุณ


ทำไมสิ่งนี้ถึงไม่เกิดขึ้นกับ visual studio?
xRobot

1
นอกจากนี้ยังทำ แต่กับ Dll อื่น ๆ ตัวอย่างเช่นถ้าคุณขาด msvcrt90.dll โครงการรวบรวมของภาพจะไม่เริ่มต้น (Iut ระบบมักจะกว้างแม้ว่าการติดตั้ง)
บรูซ

6

ดูยัง มันแก้ไขปัญหาของฉัน

ยังcompilerไงก็ตามมันเป็นธงแน่นอน? อาจจะlinkerเป็นคำที่เหมาะสมกว่าที่นี่?


1
+1 สำหรับการยกเลิกที่ถูกต้อง! ใช่ตัวเลือก "ลิงก์" ของฉันไปยัง gcc เป็นตัวเลือกของหมึกนั้น
hardmath

5

คัดลอก "libgcc_s_dw2-1.dll" ไปยัง make.exe คือ (หากคุณใช้ Msys ให้คัดลอกไปยัง \ msys \ bin) ตรวจสอบให้แน่ใจว่ากำหนดเส้นทางไปยัง make.exe ใน env PATH (ถ้า make.exe อยู่ในโฟลเดอร์ "bin" ส่วนใหญ่แล้วคุณมี msys ก็คือ \ msys \ bin) คอมไพล์ rund debug และอื่น ๆ มีความสุข


5

ไปที่ทรี MinGW http sourceforge.net ภายใต้หน้าหลัก / MinGW / Base / gcc / Version4 (หรือรุ่นที่ใช้งานอยู่) / gcc-4 (รุ่น) / คุณจะพบไฟล์เช่น gcc-core-4.8.1-4-mingw32-dll.tar.lzma . แตกไฟล์และไปที่โฟลเดอร์ bin ที่คุณจะพบ libgcc_s_dw2-1.dll และ dll อื่น ๆ คัดลอกและวางสิ่งที่คุณต้องการลงในไดเรกทอรี bin ของคุณ


5

ฉันสามารถเอาชนะสิ่งนี้ได้โดยใช้ "gcc" แทน "g ++" สำหรับคอมไพเลอร์ของฉัน ฉันรู้ว่านี่ไม่ใช่ตัวเลือกสำหรับคนส่วนใหญ่ แต่คิดว่าฉันจะพูดถึงว่าเป็นตัวเลือกในการแก้ปัญหา :)


4

คุณไม่สามารถวางไว้ใน system32 หรือสิ่งที่คุณทำกับไฟล์ dll ของผู้อื่นเพื่อให้ทุกโปรแกรมที่คุณพยายามเรียกใช้จะไม่มีปัญหานั้นในเครื่องของคุณ?

ฉันแค่ต้องการเส้นทางที่จะวาง

มันน่ารำคาญที่จะใส่ไว้ในไดเรกทอรีทุกครั้งที่ฉันรันโปรแกรมที่ฉันเพิ่งสร้าง ...

แก้ไข: ฉันพบวิธีแก้ปัญหา:

แยก libgcc_s_dw2-1.dll ไปยังตำแหน่งบนคอมพิวเตอร์ของคุณ เราขอแนะนำให้คุณคลายซิปไปที่ไดเรกทอรีของโปรแกรมที่ร้องขอ libgcc_s_dw2-1.dll

หากไม่ได้ผลคุณจะต้องแยก libgcc_s_dw2-1.dll ไปยังไดเรกทอรีระบบของคุณ โดยค่าเริ่มต้นนี่คือ:

  • C: \ Windows \ System (Windows 95/98 / Me)
  • C: \ WINNT \ System32 (Windows NT / 2000)
  • C: \ Windows \ System32 (Windows XP, Vista, 7)

หากคุณใช้ Windows รุ่น 64 บิตคุณควรวาง libgcc_s_dw2-1.dll ใน C: \ Windows \ SysWOW64 \

ตรวจสอบให้แน่ใจว่าได้เขียนทับไฟล์ที่มีอยู่ใด ๆ (แต่ทำสำเนาสำรองของไฟล์ต้นฉบับ) รีบูทคอมพิวเตอร์ของคุณ

หากปัญหายังคงเกิดขึ้นลองต่อไปนี้:

  • เปิดเมนู Start ของ Windows แล้วเลือก "Run ... "
  • พิมพ์ CMD และกด Enter (หรือถ้าคุณใช้ Windows ME ให้พิมพ์คำสั่ง)
  • พิมพ์ regsvr32 libgcc_s_dw2-1.dll แล้วกด Enter

12
กรุณาอย่าโพสต์ความคิดเห็นเป็นคำตอบที่นี่ นั่นไม่ใช่วิธีการทำงานของ Stack Overflow คุณไม่ต้องใช้ "u" แทน "you" และ "cos" แทน "เพราะ" แชทพูดไม่ได้รับอนุญาตที่นี่โดยเฉพาะ
meagar

4

เพียงไปที่การตั้งค่า >> คอมไพเลอร์และดีบั๊กจากนั้นคลิกแท็บการตั้งค่าตัวเชื่อมโยงและไปที่ "ตัวเลือกตัวเชื่อมโยงอื่น ๆ " แก้ไขตัวควบคุมและวาง: "-static-libgcc -static-libstdc ++" ไม่มีตัวเลือกการตั้งค่าคอมไพเลอร์ ในตัวเลือก Compiler Flags สำหรับ Code :: Blocks ซึ่งเป็นวิธีการแก้ปัญหานั้นฉันมาที่นี่เพื่อหาวิธีแก้ปัญหาและผู้ชายคนหนึ่งที่โพสต์เกี่ยวกับ "-static-libgcc -static-libstdc ++" ได้ให้แนวคิดที่ถูกต้องและ ฉันจัดเรียงส่วนที่เหลือโดยไม่ตั้งใจ แต่ใช้งานได้ไฟล์นี้สามารถคลิกได้จากนอกรหัส :: บล็อกทำงานได้จากเดสก์ท็อป


3

เพิ่มเส้นทางไปยัง dll นั้นลงในตัวแปรสภาพแวดล้อม PATH


ทำไมสิ่งนี้ถึงไม่เกิดขึ้นกับ visual studio?
xRobot

อาจเป็นเพราะเส้นทางไปยัง dll นั้นแสดงอยู่ในเครื่องมือ -> ตัวเลือก -> โครงการและโซลูชั่น -> ไดเรกทอรี VC ++ -> ไฟล์ปฏิบัติการ Visual Studio ดูที่นี่และในตัวแปรสภาพแวดล้อม PATH เมื่อค้นหาพา ธ ไปยัง dll
Bojan Komazec

2

การรวม-static-libgccบนบรรทัดการคอมไพล์แก้ไขปัญหา

g++ my.cpp -o my.exe -static-libgcc

ตาม: @hardmath

คุณสามารถสร้างชื่อแทนในโปรไฟล์[.profile]หากคุณอยู่ใน MSYS2

alias g++="g++ -static-libgcc"

ตอนนี้คำสั่ง GCC ของคุณจะผ่านไปเช่นกัน ;-)

โปรดรีสตาร์ทเครื่องของคุณ


1

เพิ่ม "-static" ไปยังตัวเลือกลิงเกอร์อื่น ๆ แก้ปัญหานี้ ฉันเพิ่งมีปัญหาเดียวกันหลังจากที่ฉันทดสอบในระบบอื่น แต่ไม่ใช่ด้วยตัวเองดังนั้นแม้ว่าคุณจะไม่ได้สังเกตเห็นสิ่งนี้ในระบบการพัฒนาของคุณคุณควรตรวจสอบว่าคุณมีชุดนี้หากคุณเชื่อมโยงแบบคงที่

อีกข้อสังเกตการคัดลอก DLL ไปไว้ในโฟลเดอร์เดียวกันกับไฟล์ที่เรียกใช้งานได้นั้นไม่ใช่วิธีการแก้ปัญหาเนื่องจากจะทำให้เกิดแนวคิดการเชื่อมโยงแบบสแตติก

อีกทางเลือกหนึ่งคือการใช้ MinGW เวอร์ชัน TDM ซึ่งแก้ไขปัญหานี้ได้

อัปเดตการแก้ไข: วิธีนี้อาจไม่ช่วยแก้ปัญหาสำหรับทุกคน อีกเหตุผลหนึ่งที่ฉันค้นพบเมื่อเร็ว ๆ นี้คือเมื่อคุณใช้ไลบรารีที่รวบรวมโดยบุคคลอื่นในกรณีของฉันมันเป็น SFML ซึ่งถูกรวบรวมอย่างไม่ถูกต้องและจำเป็นต้องใช้ DLL ที่ไม่มีอยู่เนื่องจากถูกคอมไพล์ด้วย MinGW รุ่นอื่น ใช้. ฉันใช้คนแคระสร้างสิ่งนี้ใช้อีกอันหนึ่งดังนั้นฉันจึงไม่ได้ DLL ทุกที่และแน่นอนฉันไม่ต้องการมันเพราะมันเป็นงานสร้างคงที่ วิธีแก้ปัญหาอาจจะเป็นการสร้างห้องสมุดใหม่หรือสร้างด้วยตัวเอง


0

การทำงานกับ msys2 ฉันได้รับข้อผิดพลาดเดียวกันกับที่พยายามเรียกใช้เวอร์ชันรีลีสของโครงการของฉันในสภาพแวดล้อมการดีบัก วิธีแก้ไขปัญหาของฉันชัดเจน: ใช้ปฏิบัติการด้วยสัญลักษณ์การดีบัก


0

ใน CodeBlocks คุณสามารถไปที่การตั้งค่า ... คอมไพเลอร์ ... และเลือก 1) ทั้งสองรายการในกล่องสีน้ำเงินหรือ 2) หนึ่งรายการในกล่องสีเขียว

การตั้งค่าคอมไพเลอร์ codeblocks


0

หากคุณสงสัยว่าคุณสามารถดาวน์โหลดไลบรารีที่แชร์ได้อย่างไร (แม้ว่าจะไม่สามารถใช้งานได้บนอุปกรณ์ของลูกค้าเว้นแต่ว่าคุณมี dll) นี่คือลิงค์: https://de.osdn.net/projects/mingw/downloads/72215/ libgcc-9.2.0-1-mingw32-dll-1.tar.xz /

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.