Bagaimana saya bisa menyingkirkan masalah “missing DLL”?

15

Saya membuat beberapa game dengan Visual C ++ 2015 dan OpenGL. Ketika saya menjalankannya di komputer saya tidak ada masalah, tetapi ketika saya menjalankannya di komputer lain itu menunjukkan bahwa beberapa DLL hilang. Saya ingin tahu cara memastikan bahwa itu tidak akan terjadi di waktu berikutnya dan hal-hal apa yang harus saya pertimbangkan sehingga saya dapat menghindari masalah file yang hilang?

Ankit singh kushwah
sumber
8
Pertama, pastikan Anda membuat versi Rilis.
user253751
3
Jika Anda ingin benar-benar yakin tidak ada dependensi dari VS itu sendiri - tetapi ia datang dengan kelemahannya sendiri - dalam pengaturan pembuatan kode Anda dapat memilih untuk pergi dengan Multi Threaded / Multi Threaded Debug (untuk debug build) daripada MT DLL / MT Debug DLL . Itu meningkatkan ukuran executable Anda dan biner Anda dikompilasi dengan cara ini tidak akan mendapat manfaat dari pembaruan runtime dll. Tapi itu terserah kamu. Sisi positifnya bahwa executable Anda tidak akan memiliki dependensi "eksternal". Saya tidak akan memposting ini sebagai jawaban karena ini bukan solusi untuk masalah Anda, hanya solusi.
Gizmo
@Gizmo solusi masih merupakan jawaban dan komentar bersifat sementara dan digunakan untuk memperjelas pos yang sedang dikerjakan, dan dapat dihapus. Jadi jika ini berguna, Anda harus mempostingnya sebagai jawaban.
user1306322
Hm baiklah. Saya akan mempostingnya sebagai jawaban.
Gizmo

Jawaban:

22

Anda perlu menginstal redistributables untuk versi Visual Studio yang Anda gunakan pada mesin apa pun yang ingin menjalankan executable, misalnya https://www.microsoft.com/en-us/download/details.aspx?id=48145 untuk VS2015 . Anda juga mungkin memerlukan redist untuk DirectX atau komponen lainnya.

Pemasang aplikasi biasanya memasang semua yang dapat didistribusikan kembali untuk setiap dependensinya. Anda dapat membuat pemasang seperti itu dengan InnoSetup, NSIS, WIX, atau berbagai alat lainnya.

Dimungkinkan untuk membuat executable yang tidak memerlukan redistributables, tetapi Anda kemudian terbatas pada subset fungsionalitas inti Windows, yang umumnya tidak cukup untuk membuat segala jenis permainan yang berarti atau aplikasi besar. Penginstal sendiri adalah contoh aplikasi yang tidak memerlukan dependensi untuk dijalankan.

Sean Middleditch
sumber
Apakah mungkin menggunakan VS untuk membangun installer seperti itu? Saya pikir saya pernah melihat sesuatu bernama OneClick di pengaturan proyek sekali.
user1306322
@ user1306322: tentu saja, satu solusi disebutkan dalam komentar pertanyaan oleh Gizmo. Ini hanya masalah runtime / DLL yang Anda tautkan. Pengaturan default meminta Anda menautkan CRL DLL versi khusus, tetapi itu bisa diubah dengan mucking di opsi tautan. Tautkan saja MSVCRT.DLL(termasuk dengan Windows itu sendiri) alih-alih MSVCPxxx.DLL(versi khusus versi yang disertakan dengan rilis Visual Studio).
Sean Middleditch
Atau jika Anda bermaksud membuat installer yang lengkap, pada dasarnya itulah WIX . Ini adalah Microsoft crapfest XML-heavy over-rumit yang khas, tetapi berhasil. Dulu ada juga "proyek pemasang" meskipun saya yakin itu sudah hilang sejak 2013 atau 2015.
Sean Middleditch
7

Saya menggunakan Dependency Walker untuk melacak DLL yang hilang:

Dependency Walker juga sangat berguna untuk mengatasi kesalahan sistem yang terkait dengan memuat dan menjalankan modul. Dependency Walker mendeteksi banyak masalah aplikasi umum seperti modul yang hilang, modul yang tidak valid, ketidakcocokan impor / ekspor, kesalahan ketergantungan melingkar, jenis modul mesin yang tidak cocok, dan kegagalan inisialisasi modul.


Ada juga opsi waktu kompilasi di VS untuk menghubungkan DLL secara statis :

  • Menghubungkan secara statis berarti DLL termasuk dalam file EXE.
  • Menautkan secara statis meningkatkan ukuran file EXE.
  • Menautkan secara statis berarti versi DLL ini akan selalu digunakan.
  • Namun, menghubungkan secara statis juga berarti Anda tidak akan pernah memiliki masalah dengan kehilangan DLL.
Leftium
sumber
1
Ketergantungan walker sudah cukup tua. Itu tidak benar meniru mekanisme Windows untuk memuat DLL lagi. Sering mengarah ke pesan palsu tentang tidak dapat menemukan DLL.
jpmc26
Dan tautan statis dapat dilarang dalam lisensi ketergantungan.
KeyWeeUsr
6

Untuk Visual C ++, Anda memiliki beberapa pilihan cara menangani redistribusi: jalankan EXE dari installer Anda (dengan hak admin), gunakan modul gabungan MSM dengan installer MSI Anda, atau bahkan DLL berdampingan. Lihat MSDN untuk detailnya.

Masalah yang lebih besar adalah OpenGL. Satu-satunya versi OpenGL yang disertakan dengan Windows adalah renderer perangkat lunak OpenGL 1.5. Hal lain membutuhkan ICD pihak ketiga untuk diinstal.

Ini adalah salah satu alasan mengapa begitu banyak permainan Windows menggunakan DirectX sebagai gantinya karena disertakan dengan sistem operasi. Lihat Penyebaran Direct3D 11 untuk Pengembang Game dan Pengaturan Tidak Begitu Langsung .

Chuck Walbourn
sumber
1
Saran OpenGL sudah ketinggalan zaman - setiap driver grafis modern dilengkapi dengan OpenGL ICD terkini.
user253751
Ive secara pribadi harus menginstal DLL openGL pada mesin yang baru berumur satu tahun
Gnemlock
@ Gnemlock Segera setelah menginstal ulang Windows pada komputer yang berumur setahun, Anda mungkin benar. Apakah Anda terus melihat masalah ini setelah menginstal paket driver resmi dari NVIDIA, AMD, atau Intel?
Damian Yerrick
2
@ Gnemlock - jika Anda secara manual menginstal OpenGL DLL maka Anda melakukan sesuatu yang salah dengan salah. Jika Anda benar-benar bermaksud "menginstal driver vendor GPU Anda" maka itulah yang dikatakan immibis juga.
Maximus Minimus
@ Gnemlock - ah, jadi tidak relevan dengan dunia nyata saat itu. Terima kasih sudah membereskannya.
Maximus Minimus
1

Penafian: Ini adalah solusi , bukan solusi untuk jawaban Anda, tetapi masih, kemungkinan yang sangat memungkinkan.

Jika Anda ingin benar-benar yakin tidak ada dependensi dari VS itu sendiri - tetapi ia datang dengan kelemahannya sendiri - dalam pengaturan pembuatan kode Anda dapat memilih untuk pergi dengan Multi Threaded (MT) / Multi Threaded Debug (MD) (untuk debug builds ) bukan MT DLL (MTd) / MT Debug DLL (MDd).

masukkan deskripsi gambar di sini

Apa kekurangannya?

  • Itu memang meningkatkan ukuran yang dapat dieksekusi dan biner Anda (meskipun jika Anda membuat game ini mungkin dapat diabaikan)
  • dikompilasi dengan cara ini tidak akan mendapat manfaat dari pembaruan runtime dll. (mis. jika Microsoft merilis VC ++ 2015 SP2, SP3, SP4 dll.) Tapi itu terserah Anda.
  • Lebih banyak penggunaan RAM (juga dapat diabaikan) karena Anda tidak menggunakan kembali kode yang ada / dimuat (DLL)
  • Anda harus yakin bahwa semua perpustakaan yang Anda tautkan dikompilasi dengan runtime yang sama, jika tidak, penautan mungkin gagal, atau kesalahan runtime yang menarik mungkin terjadi (mungkin tidak, tetapi hal itu terjadi pada saya sekali seumur hidup dalam proyek lawas yang telah diperbarui ke VS terbaru)

Dan apa kelebihannya?

  • executable Anda tidak akan memiliki dependensi "eksternal" dari VS sendiri (tidak ada persyaratan msvc * .dll).
  • beberapa orang melihat ini sebagai peningkatan kinerja karena Anda menghilangkan overhead panggilan DLL, sementara ini secara teoritis benar, peningkatannya dapat diabaikan dalam praktiknya

Periksa tautan ini untuk penjelasan yang lebih terperinci dan untuk pit-downfall yang mungkin Anda temui dengan menggunakan runtime statis.

Solusi lain adalah dengan meletakkan semua DLL yang diperlukan di tempat biner Anda. Aplikasi Anda tidak akan mendapat manfaat dari pembaruan (ke pustaka runtime) tetapi hanya itu.

Solusi sebenarnya adalah mendistribusikan aplikasi dalam mode rilis / non-debug dll (MTd) dan menyediakan installer VC ++ yang dapat didistribusikan kembali (dan penginstal perpustakaan lainnya yang mungkin Anda gunakan, misalnya OpenAL, DirectX9, PhysX), dan biarkan pengguna menjalankannya. sebelum menjalankan aplikasi Anda (seperti yang ditunjukkan oleh jawaban lain).

Pastikan juga untuk memberi tahu pengguna bahwa ia mungkin perlu memperbarui driver GPU-nya (karena juga mengandung beberapa runtime untuk banyak aplikasi, misalnya OpenGL, Vulcan).

Alat
sumber
0

Solusi saya adalah menyalin dan menempelkan DLL yang menyebabkan kesalahan ke folder tempat file .sln berada di visual studio. Setelah #includebagian itu, saya menulis #pragma comment (lib, "lost DLL name with .dll")dan menyelesaikannya!

Catatan: Saya memecahkan masalah yang saya temui dengan perpustakaan pihak ketiga (vulkan api) DLL. Mungkin itu tidak diketahui tetapi 90% akan berhasil semoga berhasil :)

pengguna96759
sumber