Alıntı (canalpay:1271873436):
> Evet uzun zaman sonra bu konuyu canlandırdım.
Sorun şu :
> dmd ezberletici.d dkv/dkvG.d dkv/bilgi.d dkv/dkvB.d
> ezberletici.o:(.data+0x24): undefined reference to `_D8oluştur12__ModuleInfoZ'
> ezberletici.o: In function `_Dmain':
> dkv/dkvB.d:(.text._Dmain+0x91): undefined reference to `_D8oluştur6girişFZv'
> collect2: ld returned 1 exit status
> --- errorlevel 1
> make: *** [derle] Hata 1
>
>
> Burdaki hatanın farkındayım. "undefined reference to `_D8oluştur12__ModuleInfoZ'" yani oluştur.d derlemek için kullanılan koda eklenmemiş. Evet çok iyi ama bu hata neden derleyiciden gelmiyorda bağlayıcıdan geliyor ?
Derleyicinin import oluştur; kod parçacığının doğru çalışması için konsol satırına gerekli şey eklemediğim için hata vermesini beklerdim. Hadi olmadı kodumda oluştur.d'de tanımlanıp ana bölümde çağrılan işlev var. Eğer oluştur.d'yi eklemediysem giriş() işlevi tanımsız olmalı. O zaman niye giriş() işlevi tanımsız diye hata vermiyor?
Bence bu bağlayıcıdan önce derleyici hata vermesi gerekir. Derleyici hata vermediği için 2 saat hata nerede diye aradım.
Sizce neden derleyici derliyorda bağlayıcı hata veriyor ? Derleyici böyle bir kodu nasıl derleyebilir ? Hiç bir şeyden haberi yok mu ?
Derleyicinin görevi o değildir zaten, derleyici sadece bir modülü derler, diğer modüllerle olan ilişkisiyle ilgilenmez.
Örneğin kod içinde, aslında hiç var olmadığı halde abuzittin() diye bir fonksiyon kullanırsan, derleyici bunun diğer modüllerden birinde olduğunu varsayarak obj modülüne ekler. C de önüne _ ekleniyor normalde ama linux da eklenmediğini farkettim :) (gcc 4.3.2).
Bağlama aşamasında ise, burada kullanılan fonksiyonlar modül içerisinde aranır, eğer bulunursa, kodda yerine bu adres yazılır, bulunamazsa birlikte derlenen kütüphanelere bakılır, statik kütüphane ise, oradaki fonksiyon koda yazılır ve diğer modüllerde ilgili yerlere adresi eklenir, dinamik kütüphane ise, geçici adres yazılır, import tablosuna fonksiyon adı yazılır ve program yüklenene kadar sadece isimler vardır, asıl adresler ancak program yüklendiğinde bilinir.
Ayrıca hem statik kütüphanelerde hem de dinamik kütüphanelerde, windowsda .lib, linux da ise, .a dosyaları projeye eklenir, ama çoğunlukla bizim kullandığımız .a lar, fonksiyon içermez, sadece dinamik kütüphanelerdeki fonksiyonlar hakkında bilgi içerir. Ancak fonksiyon yine .so ya da .dll içindedir. Örneğin windows da soket fonksiyonlarını kullanmak için projeye wsock32.lib dosyasını eklememiz, soket fonksiyonlarının bu kütüphanede olduğunu göstermez. Fonskiyonlar yine wsock32.dll dedir. Amma saptırdım konuyu :)
Özetle derleyicinin undefined reference diye hata vermesi saçmadır çünkü tüm modüllerle tek tek ilgilenir, tümünü bağlayan ise bağlayıcı olduğundan mesajı vermesi gereken o.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]