“Eksik DLL” problemlerinden nasıl kurtulabilirim?


15

Visual C ++ 2015 ve OpenGL ile bazı oyunlar yaptım. Makinemde çalıştırdığımda hiçbir sorun yoktu, ancak diğer makinelerde çalıştırdığımda bazı DLL'lerin eksik olduğunu gösteriyor. Bir dahaki sefere gerçekleşmeyeceğinden nasıl emin olacağımı ve dosya eksik problemlerinden kaçınabilmem için ne yapmam gerektiğini bilmek istiyorum?


8
İlk olarak, bir Sürüm sürümü oluşturduğunuzdan emin olun.
user253751

3
VS'nin kendisinden hiçbir bağımlılık olmadığından kesinlikle emin olmak istiyorsanız - ancak kendi dezavantajı ile birlikte gelir - kod oluşturma ayarlarında MT DLL / MT Hata ayıklama DLL . Yürütülebilir boyutu artırır ve bu şekilde derlenmiş ikili çalışma zamanı dlls güncelleştirmeler yararlanamaz. Ama bu size bağlı. Artı tarafı, çalıştırılabilirinizin "harici" bağımlılıklara sahip olmayacağıdır. Bunu bir cevap olarak göndermeyeceğim, çünkü bu sorununuza bir çözüm değil , sadece bir çözüm.
Gizmo

@Gizmo bir geçici çözüm hala bir yanıttır ve yorumlar geçicidir ve altında bulundukları yayınları açıklığa kavuşturmak için kullanılır ve silinebilir. Bu yüzden faydalıysa, bir cevap olarak göndermelisiniz.
user1306322

Hm tamam. O zaman cevap olarak göndereceğim.
Gizmo

Yanıtlar:


22

Yürütülebilir dosyaları çalıştırmak isteyen herhangi bir makinede kullandığınız Visual Studio sürümü için yeniden dağıtılabilir dosyaları yüklemeniz gerekir; örneğin , VS2015 için https://www.microsoft.com/en-us/download/details.aspx?id=48145 . DirectX veya diğer bileşenler için de tekrarlayıcılara ihtiyacınız olabilir.

Uygulamaların yükleyicileri genellikle bağımlılıkları için yeniden dağıtılabilir tüm dosyaları yükler. Böyle bir yükleyiciyi InnoSetup, NSIS, WIX veya diğer çeşitli araçlarla yapabilirsiniz.

Yeniden dağıtıma ihtiyaç duymayan yürütülebilir dosyalar yapmak mümkündür, ancak daha sonra temel Windows işlevselliğinin bir alt kümesiyle sınırlı olursunuz, bu da genellikle herhangi bir anlamlı oyun veya büyük uygulama yapmak için yeterli değildir. Yükleyicilerin kendileri, çalıştırmak için herhangi bir bağımlılığa ihtiyaç duymayan uygulamalara bir örnektir.


Böyle bir yükleyici kurmak için VS kullanmak mümkün müdür? Bir kez proje ayarlarında OneClick adında bir şey gördüğümü düşündüm.
user1306322

@ user1306322: Kesinlikle, Gizmo tarafından sorunun yorumlarında bir çözümden bahsedildi. Bu sadece hangi çalışma zamanlarına / DLL'lerine bağlandığınız meselesidir. Varsayılan ayarlar, sürüme özgü CRT DLL ile bağlantı kurmanızı sağlar, ancak bu, bağlayıcı seçeneklerine bağlanarak değiştirilebilir. Karşı Sadece bağlantı MSVCRT.DLLyerine (Windows kendisi ile birlikte) MSVCPxxx.DLL(Visual Studio sürümleri ile birlikte sürüme özgü versiyonları).
Sean Middleditch

Veya tam bir yükleyici oluşturmak istiyorsanız, temel olarak WIX budur. Tipik bir aşırı karmaşık XML-ağır Microsoft crapfest, ama işe yarıyor. Bunların 2013 ya da 2015'ten bu yana gittiğine inandığım halde "yükleyici projeleri" de vardı.
Sean Middleditch

7

Dependency Walker eksik DLL'leri izlemek için kullanın :

Dependency Walker, modüllerin yüklenmesi ve çalıştırılmasıyla ilgili sistem hatalarının giderilmesinde de çok kullanışlıdır. Bağımlılık Walker eksik modüller, geçersiz modüller, içe aktarma / dışa aktarma uyuşmazlıkları, dairesel bağımlılık hataları, uyumsuz makine modülleri ve modül başlatma hataları gibi birçok yaygın uygulama sorununu algılar.


Ayrıca, DLL'leri statik olarak bağlamak için bir derleme zamanı seçeneği vardır :

  • Statik olarak bağlama, DLL'lerin EXE dosyasına dahil edildiği anlamına gelir.
  • Statik olarak bağlama EXE dosyasının boyutunu artırır.
  • Statik olarak bağlama, DLL'in bu sürümünün her zaman kullanılacağı anlamına gelir.
  • Ancak, statik olarak bağlanma, eksik DLL'lerle ilgili bir sorun yaşamayacağınız anlamına da gelir.

1
Bağımlılık yürüteç oldukça eskidir. Artık DLL'leri yüklemek için Windows'un mekanizmalarını düzgün taklit etmiyor. Genellikle DLL'leri bulamamakla ilgili sahte mesajlara yol açar.
jpmc26

Ve bağımlılık lisansında statik bağlantı yasaklanabilir.
KeyWeeUsr

6

Visual C ++ için, yeniden dağıtma ile ilgili birkaç seçeneğiniz vardır: yükleyicinizden bir EXE çalıştırın (yönetici haklarıyla), MSI yükleyicinizle MSM birleştirme modülünü veya hatta yan yana DLL'leri kullanın. Ayrıntılar için MSDN'ye bakın.

Daha büyük sorun OpenGL. Windows ile birlikte gelen tek OpenGL sürümü bir OpenGL 1.5 yazılım oluşturucusudur. Başka bir şey üçüncü taraf bir ICD'nin kurulmasını gerektirir.

Bu, işletim sistemine dahil olduğu için birçok Windows oyununun DirectX kullanmasının nedenlerinden biridir. Bkz . Oyun Geliştiricileri için Direct3D 11 Dağıtımı ve Doğrudan Kurulum Değil .


1
OpenGL tavsiyesi eskidir - her modern grafik sürücüsü güncel bir OpenGL ICD ile birlikte gelir.
user253751

Şahsen openGL DLL'lerini bir yaş kadar küçük makinelere kurmak zorunda kaldım
Gnemlock

@Gnemlock Windows'u eski bir bilgisayara yeniden yükledikten hemen sonra haklı olabilirsiniz. NVIDIA, AMD veya Intel'den resmi sürücü paketini yükledikten sonra bu sorunu görmeye devam ettiniz mi?
Damian Yerrick

2
@Gnemlock - OpenGL DLL'leri manuel olarak yüklüyorsanız, korkunç bir şekilde yanlış bir şey yapıyorsunuz. Aslında "GPU satıcınızın sürücüsünü yükleyin" demek istiyorsanız, Immibis de tam olarak bunu söyledi.
Maximus Minimus

@Gnemlock - ah, o zaman gerçek dünyayla alakalı değil. Temizlediğin için teşekkürler.
Maximus Minimus

1

Feragatname: Bu bir çözüm , cevabınıza bir çözüm değil , yine de çok uygulanabilir bir olasılık.

VS'nin kendisinden hiçbir bağımlılık olmadığından kesinlikle emin olmak istiyorsanız - ancak kendi dezavantajları ile birlikte gelir - kod oluşturma ayarlarında, Çok Dişli (MT) / Çok Dişli Hata Ayıklama (MD) (hata ayıklama yapıları için) ile gitmeyi seçebilirsiniz. ) MT DLL (MTd) / MT Hata Ayıklama DLL (MDd) yerine.

resim açıklamasını buraya girin

Sakıncaları nelerdir?

  • Yürütülebilir boyutunuzu ve ikili dosyalarınızı artırır (bir oyun yapıyorsanız bu muhtemelen ihmal edilebilir)
  • Bu şekilde derlenmiş çalışma zamanı dlls güncelleştirmeler yararlanamaz. (örneğin, Microsoft VC ++ 2015 SP2, SP3, SP4 vb. yayınlarsa). Bu size kalmış.
  • Mevcut / yüklü kodu (DLL'ler) yeniden kullanmadığınız için daha fazla RAM kullanımı (ihmal edilebilir)
  • Bağladığınız tüm kitaplıkların aynı çalışma zamanına karşı derlendiğinden emin olmanız gerekir, başka bağlantı başarısız olabilir veya ilginç çalışma zamanı hataları oluşabilir (muhtemelen değil, ancak güncellenmiş eski bir projede ömür boyu bir kez başıma geldi en yeni VS)

Ve profesyonelleri neler?

  • yürütülebilir dosya VS'nin kendisinden "harici" bağımlılıklara sahip olmaz (msvc * .dll gereksinimi yoktur).
  • Bazı insanlar bunu bir performans artışı olarak görür çünkü DLL çağrısı yükünü ortadan kaldırırsınız, bu teorik olarak doğru olsa da, gelişmeler pratikte ihmal edilebilir

Daha ayrıntılı bir açıklama ve statik bir çalışma zamanı kullanırken karşılaşabileceğiniz çukur ve düşüşler için bu bağlantıyı kontrol edin .

Başka bir geçici çözüm , gerekli tüm DLL'leri ikili dosya koymak olacaktır. Uygulamanız güncellemelerden (çalışma zamanı kitaplıklarına) faydalanmayacak, ancak hepsi bu.

Gerçek çözüm, uygulamayı yayınlama / hata ayıklama yapmayan dll modunda (MTd) dağıtmak ve doğru VC ++ yeniden dağıtılabilir yükleyicisini (ve örneğin OpenAL, DirectX9, PhysX) kullanabileceğiniz diğer kütüphane yükleyicilerini sağlamak ve kullanıcının bunu çalıştırmasına izin vermektir. başvurunuzu çalıştırmadan önce (diğer cevapların işaret ettiği gibi).

Ayrıca kullanıcıya GPU sürücülerini muhtemelen güncellemesi gerektiğini bildirdiğinizden emin olun (bunlar birçok uygulama için birden fazla çalışma zamanı içerir, örneğin OpenGL, Vulcan).


0

Benim çözüm, hataya neden olan DLL'yi .sln dosyasının visual studio'da bulunduğu klasöre kopyalayıp yapıştırmaktı. Bölümden sonra #includeyazdım #pragma comment (lib, "lost DLL name with .dll")ve çözdüm!

Not: Üçüncü taraf bir kütüphane (vulkan api) DLL ile karşılaştığım sorunu çözdüm. Belki bilinmemektedir, ancak% 90'ı iyi şanslar sağlayacaktır :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.