Chương trình không thể bắt đầu vì thiếu libgcc_s_dw2-1.dll


166

Tôi đã tạo một chương trình đơn giản trong C ++ với Code :: Blocks.

Nếu tôi chạy nó từ Code :: Blocks, nó hoạt động chính xác; nhưng nếu tôi chạy nó bằng cách nhân đôi trên tập tin thực thi, một cửa sổ bật lên với thông báo này:

Chương trình không thể bắt đầu vì libgcc_s_dw2-1.dll bị thiếu khỏi máy tính của bạn.
Hãy thử cài đặt lại chương trình để khắc phục vấn đề này.

Vì vậy, vấn đề là gì? Tôi phải làm gì để khắc phục nó?

Câu trả lời:


196

Tôi tin rằng đây là sự cố trình biên dịch MinGW / gcc, chứ không phải là thiết lập Microsoft Visual Studio.

Các libgcc_s_dw2-1.dllphải ở trong thư mục bin của trình biên dịch. Bạn có thể thêm thư mục này vào biến môi trường PATH để liên kết thời gian chạy hoặc bạn có thể tránh sự cố bằng cách thêm "-static-libgcc -static-libstdc ++" vào cờ trình biên dịch của bạn.

Nếu bạn có kế hoạch phân phối thực thi, cái sau có lẽ có ý nghĩa nhất. Nếu bạn chỉ có kế hoạch chạy nó trên máy của riêng bạn, thì việc thay đổi biến môi trường PATH là một tùy chọn hấp dẫn (giữ kích thước của tệp thực thi).

Cập nhật:

Dựa trên phản hồi từ Greg Treleaven (xem bình luận bên dưới), tôi đang thêm liên kết vào:

[Ảnh chụp màn hình của Code :: Blocks "Tùy chọn xây dựng dự án"]

[Tùy chọn liên kết gcc GNU]

Các cuộc thảo luận sau bao gồm -static-libgcc-static-libstdc++các tùy chọn liên kết.


Tôi gặp vấn đề tương tự như @xRobot và tôi không thể tìm thấy bất cứ nơi nào để thêm công cụ vào cờ trình biên dịch, vì vậy tôi đã thử thêm nó vào Tùy chọn khác, sau đó Tùy chọn liên kết và thông báo lỗi vẫn xảy ra. Có điều gì sai với những gì tôi đang làm không?
Greg Treleaven

@Greg Treleaven: Để rõ ràng, bạn đang xây dựng một tệp thực thi với Code :: Block, nó hoạt động như mong đợi bên trong IDE nhưng báo cáo lỗi "không thể bắt đầu vì libgcc_s_dw2-1.dll bị thiếu" khi bạn cố chạy nó ngoài IDE. Bạn đã kiểm tra thư mục bin của trình biên dịch, và vâng, DLL này thực tế là có. Bạn đang cố gắng khắc phục sự cố bằng cách thực hiện một liên kết tĩnh, lấy mã được biên dịch từ thư viện để DLL (liên kết thời gian chạy) không cần thiết, nhưng nó không hoạt động. Hai gợi ý: Thực hiện xây dựng sạch (thay đổi tùy chọn có thể không kích hoạt xây dựng lại) và thử thêm biến PATH.
hardmath

@hardmath: Vẫn không hoạt động sau khi xây dựng lại sạch sẽ, vì vậy tôi đoán tôi sẽ phải sử dụng một trong những cách khác để khắc phục điều này. Cảm ơn đã giúp đỡ.
Greg Treleaven

@Greg Treleaven: Lý do để thử thêm thư mục bin của trình biên dịch vào PATH của bạn là để hiển thị (nếu điều đó làm việc) rằng tệp thực thi vẫn đang được xây dựng để liên kết thời gian chạy của các thư viện chuẩn (DLL). Tôi nghĩ rằng vấn đề là ở chỗ và chúng ta cần tìm (nếu bạn muốn thực hiện liên kết tĩnh của mã thư viện), nơi đặt cờ trình biên dịch.
hardmath

4
Cuộc thảo luận này tiếp tục (và được giải quyết) ở đây .
David C

37

Trong Eclipse, bạn sẽ tìm thấy nó trong các thuộc tính dự án> C / C ++ Build> Cài đặt> Trình liên kết MinGW C ++> Misc

Bạn phải thêm nó vào "cờ liên kết" ở trên cùng; không nơi nào khác Sau đó chỉ cần xây dựng lại.

Ảnh chụp màn hình thuộc tính Eclipse

Tôi đã thấy rằng việc liên kết những thứ đó sẽ làm nổ kích thước tĩnh lên tới 1.400kb ngay cả khi tối ưu hóa. Nó lớn hơn 277kb so với việc chỉ sao chép qua các DLL được chia sẻ. Nó cũng lớn hơn 388kb sau khi UPXing mọi thứ. Rất thua / thua ở đây. Chỉ cần bao gồm các DLL là người dùng cuối có thể quyết định xóa chúng hay không nếu chúng được cài đặt ở nơi khác.


1
Có cách nào để tránh thêm cờ liên kết trong mỗi dự án mới được tạo không?
Roger Ng

Đối với độc giả: Xin lưu ý các tùy chọn được thêm vào trong hình ảnh. Những công việc này. Điều này giúp làm tài liệu tham khảo: orfe.princeton.edu/help/article-296
PALEN

10

Code :: Blocks: thêm '-static' trong cài đặt-> trình biên dịch-> Cài đặt trình liên kết-> Tùy chọn liên kết khác.


1
Điều này làm việc hoàn hảo cho tôi về dll "mất tích" cho mỗi tiêu đề, nó rất nhanh chóng và dễ dàng, tôi khuyên bạn nên đi trước cái này.
Paul Connolly

Giải pháp tốt nhất !
iyy0v

6

Tìm dll đó trên PC của bạn và sao chép nó vào cùng thư mục mà tệp thực thi của bạn đang ở.


Tại sao điều này không xảy ra với studio hình ảnh?
xRobot

1
Nó cũng có, nhưng với các dll khác. Ví dụ: nếu bạn thiếu msvcrt90.dll, dự án được biên dịch trực quan của bạn sẽ không bắt đầu (mặc dù hệ thống thường được cài đặt rộng rãi)
Bruce

6

Xem cũng . Nó giải quyết vấn đề của tôi.

Nhân tiện, nó chắc chắn là compilercờ? Có lẽ linkerlà thuật ngữ phù hợp hơn ở đây?


1
+1 cho thuật ngữ chính xác! Có, "liên kết" của tôi với các tùy chọn liên kết gcc là một sự nhầm lẫn về điều đó (đối với các thư viện tĩnh).
hardmath

5

Sao chép "libgcc_s_dw2-1.dll" vào tệp make.exe. (Nếu bạn đang sử dụng Msys, hãy sao chép nó vào \ msys \ bin) Đảm bảo rằng đường dẫn tới make.exe được đặt trong env. PATH (nếu make.exe nằm trong thư mục "bin", rất có thể, và bạn có msys, đó là \ msys \ bin) Biên dịch, rund, gỡ lỗi, v.v. hạnh phúc.


5

Chuyển đến cây httpGf.net.net của MinGW. Trong Home / MinGW / Base / gcc / Version4 (hoặc bất kỳ phiên bản nào đang sử dụng) / gcc-4 (phiên bản) / bạn sẽ tìm thấy một tệp như gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Giải nén nó và đi vào thư mục bin nơi bạn sẽ tìm thấy libgcc_s_dw2-1.dll và các dll khác. Sao chép và dán những gì bạn cần vào thư mục bin của bạn.


5

Tôi đã có thể khắc phục điều này bằng cách sử dụng "gcc" thay vì "g ++" cho trình biên dịch của mình. Tôi biết đây không phải là một lựa chọn cho hầu hết mọi người, nhưng tôi nghĩ tôi sẽ đề cập đến nó như là một lựa chọn giải pháp :)


4

Bạn không thể đặt nó trong system32 hoặc một cái gì đó giống như bạn làm với các tệp dll của người khác, để mọi chương trình bạn cố chạy sẽ không gặp vấn đề đó trên máy của bạn?

Tôi chỉ cần con đường để đặt nó.

Thật khó chịu khi đặt nó vào thư mục mỗi khi tôi chạy một chương trình tôi vừa xây dựng ...

Chỉnh sửa: Tôi tìm thấy giải pháp:

Trích xuất libgcc_s_dw2-1.dll vào một vị trí trên máy tính của bạn. Chúng tôi khuyên bạn nên giải nén nó vào thư mục của chương trình đang yêu cầu libgcc_s_dw2-1.dll.

Nếu điều đó không làm việc, bạn sẽ phải trích xuất libgcc_s_dw2-1.dll vào thư mục hệ thống của bạn. Theo mặc định, đây là:

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

Nếu bạn sử dụng phiên bản Windows 64 bit, bạn cũng nên đặt libgcc_s_dw2-1.dll trong C: \ Windows \ SysWOW64 \

Đảm bảo ghi đè bất kỳ tệp hiện có (nhưng tạo bản sao lưu của tệp gốc). Khởi động lại máy tính của bạn.

Nếu sự cố vẫn xảy ra, hãy thử như sau:

  • Mở menu Bắt đầu của Windows và chọn "Chạy ...".
  • Nhập CMD và nhấn Enter (hoặc nếu bạn sử dụng Windows ME, nhập LỆNH)).
  • Nhập bộ đệm libgcc_s_dw2-1.dll và nhấn Enter.

12
Xin vui lòng không gửi bình luận như câu trả lời ở đây. Đó không phải là cách Stack Overflow hoạt động. Bạn cũng sẽ không sử dụng "u" thay vì "bạn" và "cos" thay vì "vì". Trò chuyện nói chuyện không được phép ở đây.
meagar

4

Chỉ cần truy cập Cài đặt >> Trình biên dịch và Trình gỡ lỗi, sau đó nhấp vào tab Cài đặt Trình liên kết và chuyển đến "Tùy chọn liên kết khác" chỉnh sửa và dán: "-static-libgcc -static-libstdc ++" vào đó, không có tùy chọn cờ trình biên dịch trong các tùy chọn Compiler Flag cho Code :: Blocks vì vậy đó là cách giải quyết vấn đề đó, tôi đến đây để tìm giải pháp và một anh chàng đã đăng bài về "-static-libgcc -static-libstdc ++" đã đưa ra ý tưởng đúng, và Tôi đã tìm ra phần còn lại một cách tình cờ nhưng nó đã hoạt động, tập tin có thể nhấp bây giờ từ bên ngoài Code :: Blocks, hoạt động ngay từ máy tính để bàn.


3

Thêm đường dẫn đến dll đó vào biến môi trường PATH.


Tại sao điều này không xảy ra với studio hình ảnh?
xRobot

Có lẽ bởi vì đường dẫn đến dll đó được liệt kê trong Công cụ của VisualStudio-> Tùy chọn-> Dự án và Giải pháp -> Thư mục VC ++ -> Tệp thực thi. Visual Studio nhìn ở đây và trong biến môi trường PATH khi tìm kiếm đường dẫn đến dlls.
Bojan Komazec

2

Bao gồm -static-libgcc trên dòng biên dịch, giải quyết vấn đề

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

Dựa theo: @hardmath

Bạn cũng có thể, tạo một bí danh trên hồ sơ của mình [.profile] nếu bạn đang ở trên MSYS2 chẳng hạn

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

Bây giờ lệnh GCC của bạn cũng đi qua ;-)

Remeber để khởi động lại Terminal của bạn


1

Thêm "-static" vào các tùy chọn liên kết khác sẽ giải quyết vấn đề này. Tôi chỉ gặp vấn đề tương tự sau khi tôi thử nghiệm điều này trên một hệ thống khác, nhưng không phải là vấn đề của riêng tôi, vì vậy ngay cả khi bạn không nhận thấy điều này trên hệ thống phát triển của mình, bạn nên kiểm tra xem bạn có cài đặt này không nếu bạn liên kết tĩnh.

Một lưu ý khác, sao chép DLL vào cùng thư mục với tệp thực thi không phải là một giải pháp vì nó đánh bại ý tưởng liên kết tĩnh.

Một tùy chọn khác là sử dụng phiên bản TDM của MinGW để giải quyết vấn đề này.

Cập nhật chỉnh sửa: điều này có thể không giải quyết vấn đề cho tất cả mọi người. Một lý do khác mà tôi phát hiện ra gần đây là khi bạn sử dụng một thư viện do người khác biên soạn, trong trường hợp của tôi, đó là SFML được biên dịch không đúng và do đó yêu cầu một DLL không tồn tại vì nó được biên dịch với một phiên bản MinGW khác với những gì tôi sử dụng. Tôi sử dụng một bản dựng lùn, cái này sử dụng cái khác, vì vậy tôi không có DLL ở bất cứ đâu và tất nhiên, tôi không muốn nó vì nó là bản dựng tĩnh. Giải pháp có thể là tìm một bản dựng khác của thư viện, hoặc tự xây dựng nó.


0

Làm việc với msys2 Tôi đã gặp lỗi tương tự khi cố gắng thực hiện phiên bản phát hành của dự án trong môi trường gỡ lỗi. Giải pháp cho vấn đề của tôi là rõ ràng: sử dụng thực thi với các biểu tượng gỡ lỗi.


0

Trong CodeBlocks, bạn có thể đi tới Cài đặt ... Trình biên dịch ... và chọn 1) hai mục trong hộp màu xanh hoặc 2) một mục trong hộp màu xanh lá cây

cài đặt trình biên dịch codeblocks


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.