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?
c++
visual-studio
Ankit singh kushwah
sumber
sumber
Jawaban:
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.
sumber
MSVCRT.DLL
(termasuk dengan Windows itu sendiri) alih-alihMSVCPxxx.DLL
(versi khusus versi yang disertakan dengan rilis Visual Studio).Saya menggunakan Dependency Walker untuk melacak DLL yang hilang:
Ada juga opsi waktu kompilasi di VS untuk menghubungkan DLL secara statis :
sumber
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.
sumber
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).
Apa kekurangannya?
Dan apa kelebihannya?
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).
sumber
Solusi saya adalah menyalin dan menempelkan DLL yang menyebabkan kesalahan ke folder tempat file .sln berada di visual studio. Setelah
#include
bagian 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 :)
sumber