Pazartesi, Ekim 19, 2015

DLL Cehennemi

DLL ingilizce  "Dynamic Link Library" teriminin baş harlerinden oluşur. Windows işletim sisteminde. Dinamik kullanılan kütüphane dosyaları için oluşturulmuş bir dosya formatıdır. Bu tip kütüphaneler çalışma zamanında hafızaya yüklenip gereken kısımlar çağrılarak çalıştırılır.

Bilgisayar dünyasında pek çok dil var. Her biri için birden fazla değişik derleyicilere sahip. Her ne kadar belli kuralları da olsa bu çeşitlilik pek çok zaman probleme sebep olmaktadır.  Hatta tecrübeyle sabittir ki aynı dilde aynı derleyicinin değişik versiyonları arasında bile problemler görülebilmektedir.

Yazımızın başlığı DLL Cehennemi terminolojiye de girmiştir. DLL Hell . Bu yüzden  programlamada genellikle kullanacağım dinamik kütüphaneleri derlemeye çalışırım. Yada aynı derleryici versiyonunda derlenmiş olanları bulmaya gayret ederim. Çünkü ne zaman, nerde probleme sebep olacağı belli olmaz. Sonra bir bakmışsınız boşyere çabalayıp durmuşsunuz.

Neyse geçenlerde Volkan kardeş picproje formundaki bir "Çizgi izleyen sanal robot " yarışmasından bahsetti. Uğraşmak istediğinden bahsetti , benden de  bir bakmamı rica etti. Anladığım kadarıyla Çizgi izleyen robotun, gömülü yazılımcılar camiasında fiyakalı bir yeri var. Şimdi bahsedeceğimiz yarışmada basit bir simulatörle robot yapmadan bu işe girişe biliyorsunuz.


Yanlız küçük ! bir ayrıntı varmış. simulatörde algoritmanızı çalıştırmak için bir dll yazmanız gerekiyor. Bir başka küçük ayrıntıda simulatör Delphi ile yazılmış olması. Bizim de bunu kendi kullandığımız dilde yani C de yazmamız lazım.

Neyse biraz ricadan biraz da merak saikiyle DLL cehennemine daldık.

İlk aklıma gelen Delphi üzerinde çalışması gerektiğinden Borland C  ile olacağına kanaat getirdim. Önce internette BorladC nin ücretsiz versiyonunu aradım. IDE olarak tabii ki emektar CodeBlock ile.

Neyse BorlandC ile yaptığım ilk denemelerden oluşan DLL ler doğrudan çakılıp kaldı. Neden olduğuna dair hiç bir fikrimde yok. Hata mesajı olmayınca nereye bakacağınızıda bilemiyorsunuz. Alınan hatanın önemli bir ip ucu olduğunu  unutmayın.

İkinci denememizi mingw32 ile yaptık. Denememiz sonrasında  "Algo? Yordamina ulasilamiyor" hata mesajına muhatap olduk. İlginçdir bahsi geçen fonksiyon vardı orda.

Windows için çok faydalı bir  uygulama var. "Dependency Walker" bu programla exe dosyaların ihtiyaç duyduğu DLL leri listelerken. DLL içindeki yordamların adlarınıda görebiliyorsunuz.


ordan bakınca bizim "Algo1" yordamı "Algo1@24" olmuş olduğunu gördüm.

sebebini araştırdım. "Decorated Names" diye bir kavrama  ulaştık.  Değişik derleyiciler değişik şekilde  yordamların ismini değiştiriyor. Bu problemden kurtulmak içinde Tanımlama dosyası - def- oluşturup.



linker için de def   komutuyla def file bildirilir.


Bütün bu işlemleri bir çırpıda anlattığıma bakmayın epey bir araştırma gerekti.  Ve en nihayetinde Artık  simulatörden çağrılabilen DLL dosayasını oluşturabildik.


LineFollowerRobot from bluekid on Vimeo.

Basit de bir algoritma yazdık yukardada videosunu koyduk.

İlgilenirseniz koduda burdan indirebilirsiniz.

2 yorum:

Adsız dedi ki...

Bu bilgiler icin cok tesekkur ederim. Yillardir Delphi yazilim gelistirmekteyim. Ayrica grafik programlamaya da oldukca merakim var GDI+ ile bir cok component gelistirdim fakat birseyleri ogrendikce hic birsey bilmedigimin farkina vardim OpenCV nin mantigini tam kavrayacak ingilizcem olmadigi icin hep bi buruk kaldi Delphi ile entegre olarak bunu kullanmak istiyorum acaba nereden baslamam lazim ornegin OpenCV ile kendi nesne tanima sistemimi olusturmak istiyorum ornegin hic olmayan bir somut nesne yaptim ve camera bunu gordugunde onu algilayacak umarim anlatabilmisimdir. Bu konuda fikirlerinize ihtiyacim var.

Saygilar

bluekid dedi ki...

Konu uzun e-posta atabilirseniz konusabiliriz