Làm thế nào tôi có thể thoát khỏi các vấn đề thiếu DLL DLL?


15

Tôi đã thực hiện một số trò chơi với Visual C ++ 2015 và OpenGL. Khi tôi chạy nó trên máy của tôi thì không có vấn đề gì, nhưng khi tôi chạy nó trên các máy khác thì nó cho thấy một số DLL bị thiếu. Tôi muốn biết làm thế nào để đảm bảo rằng điều đó sẽ không xảy ra vào lần tới và tôi nên cân nhắc những điều gì để có thể tránh các vấn đề thiếu tập tin?


8
Trước tiên, hãy đảm bảo bạn đang xây dựng phiên bản Phát hành.
dùng253751

3
Nếu bạn muốn hoàn toàn chắc chắn rằng không có sự phụ thuộc nào từ chính VS - nhưng nó có nhược điểm riêng - trong cài đặt tạo mã, bạn có thể chọn sử dụng Gỡ lỗi đa luồng / đa luồng (cho các bản dựng gỡ lỗi) thay vì MT DLL / MT gỡ lỗi DLL . Nó làm tăng kích thước thực thi của bạn và nhị phân của bạn được biên dịch theo cách này sẽ không được hưởng lợi từ các cập nhật dlls thời gian chạy. Nhưng đó là tùy thuộc vào bạn. Mặt tích cực là khả năng thực thi của bạn sẽ không có phụ thuộc "bên ngoài". Tôi sẽ không đăng bài này dưới dạng câu trả lời vì đây không phải là giải pháp cho vấn đề của bạn, chỉ là cách giải quyết.
Gizmo

@Gizmo một cách giải quyết vẫn là một câu trả lời và các bình luận chỉ là tạm thời và được sử dụng để làm rõ các bài đăng mà họ đang ở dưới và có thể bị xóa. Vì vậy, nếu nó hữu ích, bạn nên đăng nó như một câu trả lời.
dùng1306322

Hừm. Tôi sẽ đăng nó như là một câu trả lời sau đó.
Gizmo

Câu trả lời:


22

Bạn cần cài đặt các bản phân phối lại cho phiên bản Visual Studio bạn đã sử dụng trên bất kỳ máy nào muốn chạy các tệp thực thi, ví dụ: https://www.microsoft.com/en-us/doad/details.aspx?id=48145 cho VS2015 . Bạn cũng có thể cần các redists cho DirectX hoặc các thành phần khác.

Trình cài đặt của ứng dụng thường cài đặt tất cả các phân phối lại cho bất kỳ phụ thuộc nào của chúng. Bạn có thể tạo một trình cài đặt như vậy với InnoSetup, NSIS, WIX hoặc nhiều công cụ khác.

Bạn có thể tạo các tệp thực thi không cần bất kỳ phân phối lại nào, nhưng sau đó bạn bị giới hạn ở một tập hợp con của chức năng Windows cốt lõi, thường không đủ để tạo ra bất kỳ loại trò chơi có ý nghĩa hoặc ứng dụng lớn nào. Bản thân các trình cài đặt là một ví dụ về các ứng dụng không cần bất kỳ phụ thuộc nào để chạy.


Có thể sử dụng VS để xây dựng một trình cài đặt như vậy? Tôi nghĩ rằng tôi đã thấy một cái gì đó được gọi là OneClick trong cài đặt dự án một lần.
dùng1306322

@ user1306322: hoàn toàn, một giải pháp đã được đề cập trong các bình luận của câu hỏi của Gizmo. Đây chỉ là vấn đề về thời gian chạy / DLL mà bạn liên kết. Các cài đặt mặc định có bạn liên kết với DLL CRT dành riêng cho phiên bản, nhưng điều đó có thể được thay đổi bằng cách mucking trong các tùy chọn liên kết. Chỉ cần liên kết với MSVCRT.DLL(bao gồm chính Windows) thay vì MSVCPxxx.DLL(phiên bản dành riêng cho phiên bản có trong phiên bản Visual Studio).
Sean Middleditch

Hoặc nếu bạn muốn xây dựng một trình cài đặt hoàn chỉnh, về cơ bản đó là WIX . Đây là một crapfest nặng về XML quá phức tạp điển hình của Microsoft, nhưng nó hoạt động. Cũng từng có "dự án cài đặt" mặc dù tôi tin rằng những dự án đã biến mất từ ​​năm 2013 hoặc 2015.
Sean Middleditch

7

Tôi sử dụng Dependency Walker để theo dõi các DLL bị thiếu:

Dependency Walker cũng rất hữu ích để khắc phục các lỗi hệ thống liên quan đến tải và thực thi các mô-đun. Dependency Walker phát hiện nhiều vấn đề ứng dụng phổ biến như mô-đun bị thiếu, mô-đun không hợp lệ, nhập / xuất không khớp, lỗi phụ thuộc vòng tròn, loại mô-đun máy không khớp và lỗi khởi tạo mô-đun.


Ngoài ra còn có một tùy chọn biên dịch thời gian trong VS để liên kết tĩnh DLL:

  • Liên kết tĩnh có nghĩa là các DLL được bao gồm trong tệp EXE.
  • Liên kết tĩnh làm tăng kích thước của tệp EXE.
  • Liên kết tĩnh có nghĩa là phiên bản DLL này sẽ luôn được sử dụng.
  • Tuy nhiên, liên kết tĩnh cũng có nghĩa là bạn sẽ không bao giờ gặp vấn đề với việc thiếu DLL.

1
Người đi bộ phụ thuộc khá cũ. Nó không mô phỏng đúng các cơ chế của Windows để tải DLL nữa. Thường dẫn đến các tin nhắn không có thật về việc không thể tìm thấy DLL.
jpmc26

Và liên kết thống kê có thể bị cấm trong giấy phép của một người phụ thuộc.
KeyWeeUsr

6

Đối với Visual C ++, bạn có một vài lựa chọn về cách xử lý phân phối lại: chạy EXE từ trình cài đặt của bạn (có quyền quản trị viên), sử dụng mô-đun hợp nhất MSM với trình cài đặt MSI của bạn hoặc thậm chí DLL bên cạnh. Xem MSDN để biết chi tiết.

Vấn đề lớn hơn là OpenGL. Phiên bản OpenGL duy nhất có trong Windows là trình kết xuất phần mềm OpenGL 1.5. Bất cứ điều gì khác yêu cầu một bên thứ ba được cài đặt.

Đây là một trong những lý do tại sao rất nhiều trò chơi Windows sử dụng DirectX thay vì nó được bao gồm trong hệ điều hành. Xem Triển khai Direct3D 11 cho Nhà phát triển trò chơikhông thiết lập trực tiếp .


1
Lời khuyên OpenGL đã lỗi thời - mọi trình điều khiển đồ họa hiện đại đều đi kèm với một OpenGL ICD cập nhật.
dùng253751

Cá nhân Ive đã phải cài đặt DLL openGL trên các máy ít nhất một năm tuổi
Gnemlock

@Gnemlock Ngay sau khi cài đặt lại Windows trên máy tính cũ, bạn có thể đúng. Bạn có tiếp tục gặp vấn đề này sau khi cài đặt gói trình điều khiển chính thức từ NVIDIA, AMD hoặc Intel không?
Damian Yerrick

2
@Gnemlock - nếu bạn đang cài đặt thủ công OpenGL DLL thì bạn đang làm điều gì đó khủng khiếp. Nếu bạn thực sự có nghĩa là "cài đặt trình điều khiển cho nhà cung cấp GPU của bạn" thì đó chính xác là những gì người chơi cũng nói.
Maximus Minimus

@Gnemlock - à, vậy là không liên quan đến thế giới thực rồi. Cám ơn giải thích rõ ràng.
Maximus Minimus

1

Tuyên bố miễn trừ trách nhiệm: Đây là một cách giải quyết , không phải là giải pháp cho câu trả lời của bạn, nhưng vẫn là một khả năng rất khả thi.

Nếu bạn muốn hoàn toàn chắc chắn rằng không có sự phụ thuộc nào từ chính VS - nhưng nó có nhược điểm riêng - trong cài đặt tạo mã, bạn có thể chọn sử dụng Gỡ lỗi đa luồng (MT) / Gỡ lỗi đa luồng (MD) (cho các bản dựng gỡ lỗi ) thay vì MT DLL (MTd) / MT Gỡ lỗi DLL (MDd).

nhập mô tả hình ảnh ở đây

Nhược điểm là gì?

  • Nó làm tăng kích thước thực thi và nhị phân của bạn (mặc dù nếu bạn đang tạo một trò chơi thì điều này có thể không đáng kể)
  • được biên dịch theo cách này sẽ không được hưởng lợi từ các bản cập nhật dlls thời gian chạy. (ví dụ: nếu Microsoft phát hành VC ++ 2015 SP2, SP3, SP4, v.v.) Nhưng điều đó tùy thuộc vào bạn.
  • Sử dụng nhiều RAM hơn (cũng không đáng kể) vì bạn không sử dụng lại mã hiện có / đã tải (DLL)
  • Bạn cần chắc chắn rằng tất cả các thư viện mà bạn liên kết được biên dịch theo cùng thời gian chạy, liên kết khác có thể không thành công hoặc có thể xảy ra lỗi thời gian chạy thú vị (có thể không xảy ra, nhưng nó đã xảy ra với tôi một lần trong đời trong một dự án cũ đã được cập nhật VS mới nhất)

Và những ưu điểm là gì?

  • thực thi của bạn sẽ không có phụ thuộc "bên ngoài" từ chính VS (không yêu cầu msvc *.).
  • Một số người coi đây là sự gia tăng hiệu suất vì bạn đang loại bỏ chi phí cuộc gọi DLL, trong khi điều này là đúng về mặt lý thuyết, những cải tiến là không đáng kể trong thực tế

Kiểm tra liên kết này để biết giải thích chi tiết hơn và cho các nhược điểm mà bạn có thể gặp phải khi sử dụng thời gian chạy tĩnh.

Một cách giải quyết khác là đặt tất cả các DLL yêu cầu nơi nhị phân của bạn. Ứng dụng của bạn sẽ không được hưởng lợi từ các bản cập nhật (cho các thư viện thời gian chạy) nhưng đó là nó.

Giải pháp thực sự là phân phối ứng dụng ở chế độ phát hành / không gỡ lỗi (MTd) và cung cấp trình cài đặt có thể phân phối lại VC ++ chính xác (và bất kỳ trình cài đặt thư viện nào khác mà bạn có thể sử dụng, ví dụ OpenAL, DirectX9, PhysX) và cho phép người dùng chạy nó trước khi chạy ứng dụng của bạn (như các câu trả lời khác đã chỉ ra).

Ngoài ra, hãy đảm bảo cho người dùng biết rằng họ có thể cần cập nhật trình điều khiển GPU của mình (vì các trình điều khiển này cũng chứa nhiều thời gian chạy cho nhiều ứng dụng, ví dụ OpenGL, Vulcan).


0

Giải pháp của tôi là sao chép và dán DLL gây ra lỗi vào thư mục chứa tệp .sln trong phòng thu trực quan. Sau #includephần, tôi đã viết #pragma comment (lib, "lost DLL name with .dll")và giải quyết nó!

Lưu ý: Tôi đã giải quyết vấn đề mà tôi gặp phải với thư viện của bên thứ ba (Vulkan api) DLL. Có thể nó không được biết đến nhưng 90% sẽ hoạt động may mắn :)

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.