- Konu sahibi
- #1
İlk olarak hata iletisindeki DLL adını ve uygulamanın mimarisini belirleyin; ardından DLL’nin gerçekten bulunduğu klasörü, bağımlılıklarını ve 32 bit/64 bit uyumunu kontrol edin. DLL dosyası klasörde olsa bile yanlış mimarideyse, başka bir DLL’ye bağımlıysa veya gerekli çalışma zamanı kurulmamışsa Windows dosyayı yükleyemez. Sorunu çözmek için rastgele DLL indirmek yerine eksik bileşenin kaynağını belirleyip doğru sürümü kurun ya da DLL arama yolunu düzeltin.
“DLL bulunamadı” ifadesi her zaman dosyanın fiziksel olarak hiç bulunmadığı anlamına gelmez. Windows uygulamayı başlatırken DLL’yi ve onun ihtiyaç duyduğu diğer DLL’leri yükler. Ana dosya yerinde olsa bile bağımlılıklardan biri eksikse benzer hata görülebilir.
Önce hata penceresindeki tam adı not alın. Örneğin
C++ projesinin hedef mimarisi ile DLL’nin mimarisi aynı olmalıdır. Visual Studio’da proje ayarlarından hedef platformu kontrol edin. Uygulama
Kullandığınız üçüncü taraf kütüphanenin belgelerinde veya dağıtım paketinde
Uygulama ve DLL aynı mimaride olduğu hâlde hata sürüyorsa sorun büyük olasılıkla arama yolu, bağımlı DLL veya çalışma zamanı eksikliğidir.
En güvenilir ilk deneme, uygulamanın çalıştırılabilir dosyasının bulunduğu klasörü kontrol etmektir. Visual Studio’da bu klasör genellikle proje klasörü değil, yapılandırmaya göre
DLL uygulama tarafından çalışma zamanında yükleniyorsa, ilgili yükleme kodunun kullandığı yolu da inceleyin. Göreli yol kullanan kodlarda geçerli çalışma klasörü,
Düzeltmeden sonra eski DLL’nin yüklenmediğinden emin olmak için uygulamayı kapatın, doğru DLL’yi çıktı klasörüne kopyalayın ve yeniden derleyip çalıştırın. Dosya kopyalamak yerine proje çıktısına otomatik alınmasını istiyorsanız DLL’yi projeye ekleyip dosyanın derleme çıktısına kopyalanacak şekilde yapılandırabilirsiniz; kullanılan Visual Studio sürümüne göre ayar adları değişebilir.
Tablodaki “dosya klasörde olduğu hâlde yüklenemiyor” durumu özellikle önemlidir. Ana DLL’yi tekrar kopyalamak yerine, hangi bağımlılığın eksik olduğunu belirlemek gerekir.
Bir DLL başka DLL’lere bağlı olabilir. Örneğin bir kütüphane Microsoft Visual C++ çalışma zamanı bileşenlerine, grafik kitaplıklarına veya üreticinin sağladığı yardımcı DLL’lere ihtiyaç duyabilir. Ana DLL uygulama klasöründe bulunsa bile bu zincirdeki tek bir eksik dosya yükleme hatasına neden olabilir.
Bunu anlamak için güvenilir bir DLL bağımlılık analiz aracı kullanarak ana DLL’yi inceleyin. Analiz sonucunda eksik görünen dosyanın adını ve hangi mimaride arandığını not edin. Araç bir DLL’yi eksik gösterdiğinde bu, her zaman doğrudan o dosyanın bilgisayarda hiç bulunmadığını kanıtlamaz; yanlış mimarideki veya uygun olmayan sürümdeki dosya da yüklenemeyebilir.
Eksik bileşen bir üretici kütüphanesi ise ilgili SDK’nın veya uygulamanın resmî dağıtım paketini kullanın. Microsoft derleyicisiyle oluşturulmuş bir uygulamada Visual C++ çalışma zamanı gerekiyorsa, kullandığınız derleyici sürümü ve mimariyle uyumlu resmî yeniden dağıtılabilir paketi kurun. Debug derlemelerinin kullandığı geliştirme dosyaları son kullanıcı bilgisayarına kopyalanmamalıdır; dağıtım için Release yapılandırmasının gerektirdiği çalışma zamanı kullanılmalıdır.
İnternetteki rastgele DLL indirme sitelerinden dosya kopyalamayın. Aynı adlı dosya farklı sürümde veya kötü amaçlı değiştirilmiş olabilir; ayrıca gerçek eksik bağımlılığı gizleyerek yeni yükleme hataları oluşturabilir.
DLL sizin projenizin bir parçasıysa, hem DLL projesinin hem de ana uygulamanın aynı yapılandırma ve mimariyle derlendiğini kontrol edin. DLL’yi yeniden oluşturduktan sonra yalnızca DLL dosyasını değil, ona bağlı diğer çıktı dosyalarını da uygulamanın çalışacağı klasöre taşımanız gerekebilir.
Uygulama başka bir bilgisayarda çalışacaksa Visual Studio çözümündeki dosyaların geliştirici bilgisayarında bulunması yeterli değildir. Dağıtım paketine şunları ekleyin:
Hata sürüyorsa aşağıdaki bilgileri birlikte inceleyin:
Bir DLL’yi kod içinde açıkça yüklüyorsanız, yükleme başarısız olduğunda yalnızca genel hata mesajı göstermek yerine yüklenen tam yolu, mimariyi ve hata kodunu tanılama amacıyla kaydedebilirsiniz. Bu kayıtları kullanıcıya açık hassas konum bilgileri içermeyecek şekilde sınırlayın ve sorun çözüldüğünde ayrıntılı tanılama çıktısını kapatın. Böylece hatanın dosya yolu mu, bağımlılık mı, yoksa mimari uyumsuzluk mu olduğu daha kolay ayrılır.
Sonuç olarak çözüm sırası şöyledir: tam DLL adını belirleyin, uygulama ile DLL mimarisini eşleştirin, DLL’nin gerçek çıktı klasöründe bulunduğunu doğrulayın, bağımlı DLL’leri ve C++ çalışma zamanını kontrol edin, ardından temiz bir Release dağıtımıyla yeniden deneyin. Ana dosya mevcut olduğu hâlde hata devam ediyorsa, artık dosyanın varlığını değil bağımlılık zincirini ve yükleme ortamını incelemelisiniz.
Hata iletisinin ne söylediğini ayırın
“DLL bulunamadı” ifadesi her zaman dosyanın fiziksel olarak hiç bulunmadığı anlamına gelmez. Windows uygulamayı başlatırken DLL’yi ve onun ihtiyaç duyduğu diğer DLL’leri yükler. Ana dosya yerinde olsa bile bağımlılıklardan biri eksikse benzer hata görülebilir.
Önce hata penceresindeki tam adı not alın. Örneğin
example.dll adı geçiyorsa şu üç durumu birbirinden ayırın:- Dosya gerçekten eksiktir: DLL uygulamanın çalıştırıldığı klasörde veya Windows’un arama yollarından birinde değildir.
- Bağımlı DLL eksiktir:
example.dllbulunur ancak onun kullandığı başka bir kitaplık bulunamaz. - Mimari uyumsuzdur: 32 bit uygulama 64 bit DLL’yi veya 64 bit uygulama 32 bit DLL’yi yüklemeye çalışır.
Önce mimari uyumunu kontrol edin
C++ projesinin hedef mimarisi ile DLL’nin mimarisi aynı olmalıdır. Visual Studio’da proje ayarlarından hedef platformu kontrol edin. Uygulama
Win32 veya x86 olarak derlenmişse 32 bit DLL, x64 olarak derlenmişse 64 bit DLL gerekir. Any CPU gibi bir ayar C++ uygulamaları için doğrudan çözüm değildir; derleme çıktısının hangi mimaride üretildiğini açıkça belirlemek gerekir.Kullandığınız üçüncü taraf kütüphanenin belgelerinde veya dağıtım paketinde
x86, x64 ya da benzer mimari ayrımı varsa uygulamanızla aynı paketi seçin. DLL dosyasının adına bakarak mimariyi kesin olarak anlamaya çalışmayın; aynı adlı dosyanın farklı mimarileri bulunabilir.Uygulama ve DLL aynı mimaride olduğu hâlde hata sürüyorsa sorun büyük olasılıkla arama yolu, bağımlı DLL veya çalışma zamanı eksikliğidir.
DLL’nin doğru klasörde olduğunu doğrulayın
En güvenilir ilk deneme, uygulamanın çalıştırılabilir dosyasının bulunduğu klasörü kontrol etmektir. Visual Studio’da bu klasör genellikle proje klasörü değil, yapılandırmaya göre
Debug veya Release altında oluşan çıktı klasörüdür. DLL’yi yalnızca kaynak kodun bulunduğu klasöre koymak yeterli olmayabilir.DLL uygulama tarafından çalışma zamanında yükleniyorsa, ilgili yükleme kodunun kullandığı yolu da inceleyin. Göreli yol kullanan kodlarda geçerli çalışma klasörü,
.exe dosyasının bulunduğu klasörden farklı olabilir. Visual Studio içinden çalıştırırken çalışma dizini proje ayarları veya başlatma yapılandırması nedeniyle değişebilir.Düzeltmeden sonra eski DLL’nin yüklenmediğinden emin olmak için uygulamayı kapatın, doğru DLL’yi çıktı klasörüne kopyalayın ve yeniden derleyip çalıştırın. Dosya kopyalamak yerine proje çıktısına otomatik alınmasını istiyorsanız DLL’yi projeye ekleyip dosyanın derleme çıktısına kopyalanacak şekilde yapılandırabilirsiniz; kullanılan Visual Studio sürümüne göre ayar adları değişebilir.
| Belirti | Olası neden | İzlenecek yol |
|---|---|---|
| DLL adı bulunamıyor | Dosya arama yolunda değil | Çıktı klasörünü, çalışma dizinini ve yükleme yolunu kontrol edin |
| Dosya klasörde olduğu hâlde yüklenemiyor | Bağımlı DLL eksik olabilir | DLL bağımlılıklarını analiz edin ve eksik bileşeni doğru kaynaktan kurun |
| Yanlış mimari veya geçersiz uygulama hatası | x86 ve x64 uyuşmazlığı | Uygulama ile tüm DLL zincirini aynı mimaride derleyin veya uygun paketi kullanın |
| Debug’da çalışıyor, Release’te çalışmıyor | Farklı çıktı klasörü veya çalışma zamanı | Release bağımlılıklarını ve dağıtım dosyalarını ayrıca kontrol edin |
Eksik bağımlılığı ve çalışma zamanını bulun
Bir DLL başka DLL’lere bağlı olabilir. Örneğin bir kütüphane Microsoft Visual C++ çalışma zamanı bileşenlerine, grafik kitaplıklarına veya üreticinin sağladığı yardımcı DLL’lere ihtiyaç duyabilir. Ana DLL uygulama klasöründe bulunsa bile bu zincirdeki tek bir eksik dosya yükleme hatasına neden olabilir.
Bunu anlamak için güvenilir bir DLL bağımlılık analiz aracı kullanarak ana DLL’yi inceleyin. Analiz sonucunda eksik görünen dosyanın adını ve hangi mimaride arandığını not edin. Araç bir DLL’yi eksik gösterdiğinde bu, her zaman doğrudan o dosyanın bilgisayarda hiç bulunmadığını kanıtlamaz; yanlış mimarideki veya uygun olmayan sürümdeki dosya da yüklenemeyebilir.
Eksik bileşen bir üretici kütüphanesi ise ilgili SDK’nın veya uygulamanın resmî dağıtım paketini kullanın. Microsoft derleyicisiyle oluşturulmuş bir uygulamada Visual C++ çalışma zamanı gerekiyorsa, kullandığınız derleyici sürümü ve mimariyle uyumlu resmî yeniden dağıtılabilir paketi kurun. Debug derlemelerinin kullandığı geliştirme dosyaları son kullanıcı bilgisayarına kopyalanmamalıdır; dağıtım için Release yapılandırmasının gerektirdiği çalışma zamanı kullanılmalıdır.
İnternetteki rastgele DLL indirme sitelerinden dosya kopyalamayın. Aynı adlı dosya farklı sürümde veya kötü amaçlı değiştirilmiş olabilir; ayrıca gerçek eksik bağımlılığı gizleyerek yeni yükleme hataları oluşturabilir.
C++ projesinde ayarları ve dağıtımı düzeltin
DLL sizin projenizin bir parçasıysa, hem DLL projesinin hem de ana uygulamanın aynı yapılandırma ve mimariyle derlendiğini kontrol edin. DLL’yi yeniden oluşturduktan sonra yalnızca DLL dosyasını değil, ona bağlı diğer çıktı dosyalarını da uygulamanın çalışacağı klasöre taşımanız gerekebilir.
Uygulama başka bir bilgisayarda çalışacaksa Visual Studio çözümündeki dosyaların geliştirici bilgisayarında bulunması yeterli değildir. Dağıtım paketine şunları ekleyin:
- Ana
.exedosyası. - Uygulamanın kullandığı kendi DLL’leri.
- DLL’lerin ihtiyaç duyduğu yardımcı kitaplıklar.
- Gerekli mimarideki C++ çalışma zamanı bileşenleri.
- Varsa üçüncü taraf kütüphanelerin lisans ve dağıtım koşullarına uygun dosyaları.
Sorun devam ederse hangi bilgileri toplayın
Hata sürüyorsa aşağıdaki bilgileri birlikte inceleyin:
- Hata iletisinde geçen tam DLL adı.
- Uygulamanın x86 mı x64 mü olduğu.
- DLL’nin x86 mı x64 mü olduğu ve hangi sürümden alındığı.
- Uygulamanın Debug mı Release mi çalıştırıldığı.
- DLL’nin bulunduğu tam klasör yolu.
- Bağımlılık analizinde eksik görünen diğer DLL adları.
- Sorunun yalnızca başka bilgisayarda mı, yoksa geliştirme bilgisayarında da mı oluştuğu.
graphics.dll çıktı klasöründe bulunuyor, ancak bağımlılık analizinde x86 çalışma zamanı eksik görünüyor” bilgisi, yalnızca “DLL bulunamadı” demekten çok daha değerlidir. Bu durumda yeniden aynı DLL’yi indirmek yerine x64 uyumlu çalışma zamanını veya kütüphane paketini düzeltmek gerekir.Bir DLL’yi kod içinde açıkça yüklüyorsanız, yükleme başarısız olduğunda yalnızca genel hata mesajı göstermek yerine yüklenen tam yolu, mimariyi ve hata kodunu tanılama amacıyla kaydedebilirsiniz. Bu kayıtları kullanıcıya açık hassas konum bilgileri içermeyecek şekilde sınırlayın ve sorun çözüldüğünde ayrıntılı tanılama çıktısını kapatın. Böylece hatanın dosya yolu mu, bağımlılık mı, yoksa mimari uyumsuzluk mu olduğu daha kolay ayrılır.
Sonuç olarak çözüm sırası şöyledir: tam DLL adını belirleyin, uygulama ile DLL mimarisini eşleştirin, DLL’nin gerçek çıktı klasöründe bulunduğunu doğrulayın, bağımlı DLL’leri ve C++ çalışma zamanını kontrol edin, ardından temiz bir Release dağıtımıyla yeniden deneyin. Ana dosya mevcut olduğu hâlde hata devam ediyorsa, artık dosyanın varlığını değil bağımlılık zincirini ve yükleme ortamını incelemelisiniz.