Program tidak dapat memulai karena libgcc_s_dw2-1.dll hilang

166

Saya telah membuat program sederhana dalam C ++ dengan Code :: Blocks.

Jika saya menjalankannya dari Code :: Blocks, ia berfungsi dengan benar; tetapi jika saya menjalankannya dengan menggandakan pada file yang dapat dieksekusi, sebuah jendela muncul dengan pesan ini:

Program tidak dapat memulai karena libgcc_s_dw2-1.dll hilang dari komputer Anda.
Coba instal ulang program untuk memperbaiki masalah ini.

Jadi apa masalahnya? Apa yang harus saya lakukan untuk memperbaikinya?

xRobot
sumber

Jawaban:

196

Saya percaya ini adalah masalah kompiler MinGW / gcc, daripada pengaturan Microsoft Visual Studio.

The libgcc_s_dw2-1.dllharus dalam direktori bin compiler. Anda bisa menambahkan direktori ini ke variabel lingkungan PATH Anda untuk penautan runtime, atau Anda bisa menghindari masalah dengan menambahkan "-static-libgcc -static-libstdc ++" ke flag kompiler Anda.

Jika Anda berencana untuk mendistribusikan executable, yang terakhir mungkin paling masuk akal. Jika Anda hanya berencana untuk menjalankannya di komputer Anda sendiri, mengubah variabel lingkungan PATH adalah opsi yang menarik (menekan ukuran executable).

Diperbarui:

Berdasarkan umpan balik dari Greg Treleaven (lihat komentar di bawah), saya menambahkan tautan ke:

[Screenshot of Code :: Blocks "Project build options"]

[Opsi tautan gcc GNU]

Diskusi terakhir termasuk -static-libgccdan -static-libstdc++opsi tautan.

hardmath
sumber
Saya memiliki masalah yang sama dengan @xRobot, dan saya tidak dapat menemukan tempat untuk menambahkan barang ke flag compiler, jadi saya mencoba menambahkannya ke Opsi Lainnya, lalu Opsi Linker, dan pesan kesalahan masih terjadi. Apakah ada yang salah dengan apa yang saya lakukan?
Greg Treleaven
@Greg Treleaven: Hanya untuk kejelasan, Anda sedang membangun sebuah executable dengan Code :: Block, ini berfungsi seperti yang diharapkan di dalam IDE tetapi melaporkan kesalahan "tidak dapat memulai karena libgcc_s_dw2-1.dll hilang" ketika Anda mencoba menjalankannya di luar IDE. Anda memeriksa direktori bin kompiler, dan ya, DLL ini sebenarnya ada di sana. Anda mencoba untuk memperbaiki masalah dengan melakukan tautan statis, yang menarik kode terkompilasi dari perpustakaan sehingga DLL (runtime linkage) tidak diperlukan, tetapi tidak berfungsi. Dua saran: Lakukan build bersih (mengubah opsi mungkin tidak memicu pembangunan kembali), dan coba tambahkan variabel PATH.
hardmath
@hardmath: Masih tidak berfungsi setelah melakukan pembangunan kembali yang bersih, jadi saya kira saya harus menggunakan salah satu cara lain untuk memperbaikinya. Terima kasih telah membantu.
Greg Treleaven
@Greg Treleaven: Alasan untuk mencoba menambahkan direktori kompiler bin ke PATH Anda adalah untuk menunjukkan (jika itu membuat hal-hal bekerja) bahwa executable masih dibangun untuk link runtime dari pustaka standar (DLL). Saya berpikir bahwa masalahnya adalah itu dan kita perlu menemukan (jika Anda ingin melakukan hubungan statis kode perpustakaan) di mana harus meletakkan flag compiler.
hardmath
4
Diskusi ini berlanjut (dan diselesaikan) di sini .
David C
37

Di Eclipse, Anda akan menemukannya di bawah properti proyek> C / C ++ Build> Pengaturan> MinGW C ++ Linker> Lain-lain

Anda harus menambahkannya ke "bendera penghubung" di bagian atas; tidak ada tempat lain. Kemudian bangun kembali.

Tangkapan layar Eclipse properties

Saya telah menemukan bahwa menghubungkan mereka yang meledak secara statis ukurannya hingga 1.400 kb bahkan dengan optimasi. Ini 277kb lebih besar dibandingkan dengan hanya menyalin di atas DLL bersama. Ini 388kb lebih besar juga setelah UPX segalanya. Sangat kalah / kalah di sini. Cukup sertakan DLL karena pengguna akhir dapat memutuskan untuk menghapusnya atau tidak jika mereka menginstalnya di tempat lain.

TommyTom
sumber
1
Apakah ada cara untuk menghindari menambahkan bendera tautan di setiap proyek yang baru dibuat?
Roger Ng
Untuk para pembaca: Harap perhatikan opsi yang ditambahkan dalam gambar. Ini bekerja. Ini membantu sebagai referensi: orfe.princeton.edu/help/article-296
PALEN
10

Kode :: Blok: tambahkan '-static' di pengaturan-> compiler-> Pengaturan tautan-> Opsi tautan lainnya.

pengguna1826947
sumber
1
Ini bekerja dengan baik untuk saya mengenai "hilang" dll per judul, sangat cepat dan mudah, saya akan merekomendasikan mencoba yang ini dulu.
Paul Connolly
Solusi terbaik !
iyy0v
6

Temukan dll di PC Anda, dan salin ke direktori yang sama dengan yang dapat dieksekusi.

Dave
sumber
mengapa ini tidak terjadi dengan studio visual?
xRobot
1
Itu juga, tetapi dengan dll lain. Contohnya, jika Anda kekurangan msvcrt90.dll, proyek kompilasi visual Anda tidak akan mulai (sistem iut biasanya sudah terinstal luas)
Bruce
6

Lihat juga . Itu memecahkan masalah saya.

Ngomong-ngomong, apakah sudah pasti compilerditandai? Mungkin linkeristilah yang lebih cocok di sini?

lemak
sumber
1
+1 untuk terminolgy yang benar! Ya, "tautan" saya ke opsi tautan gcc adalah gagasan tentang hal itu (untuk pustaka statis).
hardmath
5

Salin "libgcc_s_dw2-1.dll" ke make.exe adalah. (Jika Anda menggunakan Msys, salin ke \ msys \ bin) Pastikan path untuk make.exe diatur di env. PATH (jika make.exe ada di folder "bin", kemungkinan besar, dan Anda memiliki msys, ini \ msys \ bin) Kompilasi, rund, debug, dll. Senang.

Blizz
sumber
5

Pergi ke pohon http MinGW sourceforge.net. Di bawah Home / MinGW / Base / gcc / Version4 (atau penggunaan versi apa pun yang digunakan) / gcc-4 (versi) / Anda akan menemukan file seperti gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Ekstrak dan pergi ke folder bin di mana Anda akan menemukan libgcc_s_dw2-1.dll Anda dan lain-lain. Salin dan rekatkan apa yang Anda butuhkan ke direktori tempat sampah Anda.


sumber
5

Saya bisa mengatasinya dengan menggunakan "gcc" bukannya "g ++" untuk kompiler saya. Saya tahu ini bukan pilihan bagi kebanyakan orang, tetapi saya pikir saya akan menyebutkannya sebagai opsi penyelesaian :)

rogerdpack
sumber
4

Tidak bisakah Anda meletakkannya di system32 atau sesuatu seperti yang Anda lakukan dengan file dll yang lain, sehingga setiap program yang Anda coba jalankan tidak akan memiliki masalah pada mesin Anda?

Saya hanya perlu jalan di mana meletakkannya.

Agak menyebalkan untuk meletakkannya di direktori setiap kali saya menjalankan program yang baru saja saya buat ...

Sunting: Saya menemukan solusinya:

Ekstrak libgcc_s_dw2-1.dll ke lokasi di komputer Anda. Kami menyarankan Anda untuk unzip ke direktori program yang meminta libgcc_s_dw2-1.dll.

Jika itu tidak berhasil, Anda harus mengekstrak libgcc_s_dw2-1.dll ke direktori sistem Anda. Secara default, ini adalah:

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

Jika Anda menggunakan Windows versi 64-bit, Anda juga harus menempatkan libgcc_s_dw2-1.dll di C: \ Windows \ SysWOW64 \

Pastikan menimpa file yang ada (tetapi buat salinan cadangan dari file asli). Nyalakan ulang komputer Anda.

Jika masalah masih terjadi, coba yang berikut ini:

  • Buka menu Start Windows dan pilih "Run ...".
  • Ketik CMD dan tekan Enter (atau jika Anda menggunakan Windows ME, ketik COMMAND)).
  • Ketik regsvr32 libgcc_s_dw2-1.dll dan tekan Enter.
yossi
sumber
12
Tolong jangan posting komentar sebagai jawaban di sini. Itu bukan cara kerja Stack Overflow. Anda juga tidak akan jauh menggunakan "u" bukannya "Anda" dan "cos" bukannya "karena". Obrolan bicara tidak diizinkan di sini.
meagar
4

Cukup buka Pengaturan >> Compiler dan Debugger, lalu klik tab Pengaturan Linker dan buka kontrol edit "Opsi tautan lain" dan tempel: "-static-libgcc -static-libstdc ++" untuk itu, tidak ada opsi flag compiler dalam opsi Flag Compiler untuk Code :: Blocks jadi itulah cara untuk menyelesaikan masalah itu, saya datang ke sini mencari solusi juga dan satu orang yang memposting tentang "-static-libgcc -static-libstdc ++" memberikan ide yang tepat, dan Saya mengurutkan sisanya secara tidak sengaja tetapi berhasil, file tersebut dapat diklik sekarang dari luar Code :: Blocks, berfungsi langsung dari desktop.

Jack Offington
sumber
3

Tambahkan path ke dll ke dalam variabel lingkungan PATH.

Bojan Komazec
sumber
mengapa ini tidak terjadi dengan studio visual?
xRobot
Mungkin karena jalur ke dll itu tercantum dalam Alat VisualStudio-> Pilihan-> Proyek dan Solusi -> Direktori VC ++ -> File yang Dapat Dieksekusi. Visual Studio terlihat di sini dan dalam variabel lingkungan PATH saat mencari jalur ke dll.
Bojan Komazec
2

Termasuk -static-libgcc pada baris kompilasi, menyelesaikan masalah

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

Menurut: @hardmath

Anda juga dapat membuat alias di profil [. Profil] jika Anda menggunakan MSYS2 misalnya

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

Sekarang perintah GCC Anda berjalan juga ;-)

Ingat untuk memulai kembali Terminal Anda

PYK
sumber
1

Tambahkan "-static" ke opsi tautan lain untuk menyelesaikan masalah ini. Saya baru saja mengalami masalah yang sama setelah saya menguji ini pada sistem lain, tetapi tidak pada saya sendiri, jadi bahkan jika Anda belum melihat ini pada sistem pengembangan Anda, Anda harus memeriksa bahwa Anda memiliki set ini jika Anda menghubungkan secara statis.

Catatan lain, menyalin DLL ke folder yang sama dengan yang dapat dieksekusi bukanlah solusi karena mengalahkan ide menghubungkan secara statis.

Pilihan lain adalah menggunakan versi TDM dari MinGW yang memecahkan masalah ini.

Perbarui edit: ini mungkin tidak menyelesaikan masalah untuk semua orang. Alasan lain yang baru-baru ini saya temukan untuk ini adalah ketika Anda menggunakan perpustakaan yang dikompilasi oleh orang lain, dalam kasus saya itu adalah SFML yang dikompilasi secara tidak benar dan karenanya memerlukan DLL yang tidak ada karena dikompilasi dengan versi MinGW yang berbeda dari apa yang saya menggunakan. Saya menggunakan dwarf build, ini menggunakan yang lain, jadi saya tidak punya DLL di mana saja dan tentu saja, saya tidak menginginkannya karena itu adalah build statis. Solusinya mungkin dengan menemukan bangunan perpustakaan lain, atau membangunnya sendiri.

Neil Roy
sumber
0

Bekerja dengan msys2 Saya telah memperoleh kesalahan yang sama dengan mencoba menjalankan versi rilis proyek saya di lingkungan debug. Solusi untuk masalah saya jelas: gunakan executable dengan simbol debug.

Rubén Pozo
sumber
0

Di CodeBlocks Anda dapat pergi ke Pengaturan ... Compiler ... dan pilih 1) dua item di kotak biru atau 2) satu item di kotak hijau

pengaturan kompiler kode kunci

raddevus
sumber