Sorun

Bazen bir kütüphaneyi (ve onun işlevlerini) çalışma zamanında yüklemek zorunda olabilirsiniz; bu çoğunlukla programınız için bir çeşit uyumlu-ek (plug-in) veya modül yazdığınızda ortaya çıkar.

C programlama dilinde, kütüphane yükleme çok sadedir (dlopen, dlsym ve dlclose işlevlerini çağırmak yeterli), C++ ile bu biraz karmaşıktır. C++ kütüphanelerini dinamik olarak yüklemenin zorluğu kısmen isim cendereleme (name mangling) işleminden ve dlopen API'nin C ile yazılmasından ileri gelir. Bu yüzden C++ sınıflarını yüklemek için elverişli bir yöntem sunmaz.

C++'da sınıfların nasıl yüüklendiğini açıklamadan önce, dilerseniz isim cendereleme özelliğine bakarak sorunu analiz edelim. Sorunun nasıl oluştuğunu ve nasıl çözüleceğini anlamak için ilgilenmeseniz bile isim cendereleme işleminin açıklamasını okumanızı tavsiye ediyorum.

İsim Cendereleme

Her C++ programında (veya kütüphanesinde veya nesne dosyasında), statik olmayan tüm işlevler ikili dosya içinde sembollerle temsil edilir. Bu semboller bir işlevin programda, kütüphanede veya nesne dosyasında tek ve diğerlerinden farklı olarak gösterildiği bir dizgedir.

C'de sembol isimleri ile işlev isimleri aynıdır: strcpy'nin sembolü de strcpy olacaktır, vb. C'de bu şekilde kullanım mümkündür çünkü statik olmayan aynı isimli iki işlev yoktur.

C++ aşırı yüklemeye (farklı işlevlerin değişik argümanlarla aynı isme sahip olması) izin verdiği için ve C'nin izin vermediği bir çok özelliği olduğu için -sınıflar, eleman işlevler, istisnai durum belirtimleri gibi- işlev isimlerini basitçe sembol ismi olarak kullanmak mümkün değildir. Bunu çözmek için C++ isim cendereleme denen, işlev isimlerinin ve tüm gerekli bilgilerin (argümanların sayısı ve boyutu gibi) sadece derleyicinin bildiği bazı garip görünümlü dizgelere dönüştürüldüğü yöntemi kullanır. Örneğin cenderelenen foo ismi foo@4%6^ gibi gözükebilir. Hatta "foo" kelimesini bile içermeyebilir.

Cendereleme ile ilgili başka bir sorun da C++ standardının (şu anda [ISO14882]) isimlerin nasıl cendereleneceğini tanımlamamasıdır. Bu yüzden her derleyici cendereleme işlemini kendine göre yapar. Hatta bazı derleyicilerin farklı sürümleri arasında bile isim cendereleme algoritmaları değişiklik göstermektedir (özellikle g++2.x ve 3.x). Belirli bir derleyicinin isim cendereleme işlemini nasıl yaptığını çözseniz bile (ve böylece işlevleri dlsym ile yükleyebilirsiniz) bu muhtemelen sadece sizin derleyicinizde çalışacak ve bir sonraki sürüme uymayacaktır.

Sınıflar

dlopen API ile ilgili diğer bir sorun sadece yükleme işlevlerini desteklemesidir. Fakat C++ sıklıkla programınızda kullanmak isteyeceğiniz bir sınıf ortaya çıkarır. Açıktır ki bu sınıfı kullanmak için o sınıfın bir örneğini (nesne) oluşturmanız gerekir, fakat bu kolay bir şekilde yapılamaz.