Forum: D Programlama Dili RSS
D de Hata Mesajları Yeterli Mi ?
Sayfa:  önceki  1  2 
canalpay (Moderatör) #16
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1880
Acaba hiçbir işleve dahil olmadan, evrensel alanda mı yazıyorsun?

Evet. Dediğinizi yaptım ve çalıştı.

static this() ne anlama geliyor ? Daha öncede söylemiştiniz sanırım ama anlamadım.
acehreli (Moderatör) #17
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
static this, bir modülün en başta tek kere çalıştırılacak olan ve bir anlamda o modülü ilkleyen kodlarını içeriyor. main()'in başlamasından önce işletiliyor.

Açıklaması şuradaymış:

http://www.digitalmars.com/d/2.0/class.html#StaticConstruc…

ddili.org'da anlatmamışım. :( Google'da şöyle aratınca bir kaç bilgiye rastlanıyor:

"static this" site:ddili.org

Ali
KUTALMIS #18
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 1877
canalpay on 2010-04-21, 12:10:
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.
acehreli (Moderatör) #19
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
KUTALMIS:
ama çoğunlukla bizim kullandığımız .a lar, fonksiyon içermez, sadece dinamik kütüphanelerdeki fonksiyonlar hakkında bilgi içerir

Windows'da .a dosyaları var mı bilmiyorum ama Linux'taki .a'lar aslında arşiv (archive) dosyalarıdır. Bu dosyaları ar programı ile yönetebiliriz. Örneğin içine bakmak için t seçeneği ile:

$ ar t /usr/lib/libm.a
k_standard.o
s_lib_version.o
...
slowpow.o

nm programı da bu dosyaların hangi sembolleri tanımladığını gösterir:

$ nm /usr/lib/libm.a

Onun çıktısında başında örneğin T bulunan satırlar, o sembolün "text (code)" bölümünde tanımlı olduğunu söyler. Bir örnek:

...
w_sqrt.o:
00000000 T __sqrt
00000000 W sqrt
         U __csqrt
         U __csqrt
...

Ancak fonksiyon yine .so ya da .dll içindedir

Benim bildiğim, o dosyalarda da vadır ama .a dosyalarında da vardır. (Yine Linux için söylüyorum.)

Ö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.

Acaba programı "dynamic" olarak oluşturunca mı öyle olur? O söylediğin programı "static" olarak oluşturunca da geçerli mi?

Ali
KUTALMIS #20
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam tabiki aynı zamanda arşiv dosyasılar, bunu kabul ediyorum, ancak bir statik kütüphane var bir de import kütüphanesi, ikisinin de uzantısı aynıdır ancak birisi doğrudan kod içerirken diğeri dinamik kütüphane içindeki fonksiyonlar hakkında bilgi içerir.
Bizim çoğunlukla kullandığımız ikinci yöntem, yani import kütüphaneleri, örneğin windows da bir dll oluşturulurken, yanında def dosyası ve lib dosyası da çıkar. İşte bu lib dosyası kesinlikle statik kütüphane değildir, test edilebilir.
Oluşan dll içindeki fonksiyonları kullanabilmek için bu lib ya da a dosyası projeye dahil edilir ancak program çalışmak için yine dinamik kütüphaneye ihtiyaç duyar.
Bu import kütüphaneleri windows da _MessageBoxA@16 gibi satırlar içerirler, @ karakterinin sonrası toplam parametre boyutudur.
Son olarak, herhangi bir kütüphaneyi kullanarak bir programı statik oluştur dediğinizde gerçekten statik olarak oluştuğunu test ettiniz mi?
(windows da .a lar sadece mingw de kullanılıyor)
acehreli (Moderatör) #21
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
KUTALMIS:
herhangi bir kütüphaneyi kullanarak bir programı statik oluştur dediğinizde gerçekten statik olarak oluştuğunu test ettiniz mi?
(windows da .a lar sadece mingw de kullanılıyor)

mingw de bir "unix ortamı", değil mi... Linux'ta bir program üzerinde ldd çalıştırılınca, o programın bağımlı olduğu kütüphaneleri söyler. Örneğin bir C++ programı için:

$ ldd deneme
        linux-gate.so.1 =>  (0x007f9000)
        libboost_filesystem.so.2 => /usr/lib/libboost_filesystem.so.2 (0x0079a000)
...

Programı -static seçeneği ile oluşturunca, statik program haline gelir:

$ ldd deneme
        not a dynamic executable

Boyu da 10 kat arttığına göre, bütün kodun programın içine gömüldüğünü düşünüyorum. Bunu görmek için nm'i çalıştırınca içinde tanımlanmamış tek bir işlev buluyorum:

$ nm deneme | grep ' U'
         U ___tls_get_addr

O da herhalde "thread local storage" ilgili olan ve belki de bu programda kullanılmayan bir işlev... Onun dışında bütün işlevler programa gömülü. Ben statik programdan bunu anlıyorum.

Belki de mingw'de .a dosyalarının farklı olmalarını gerektiren nedenler vardır.

Ali
KUTALMIS #22
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam mingw nin .a dosyaları ,windows un .lib dosyalarıyla aynı, uzantı dışında. Ancak ben o dediğinizi daha önce denemiştim ve mingw de hiç birşey değişmemişti. Linuxda da öyle olacağını düşündüm ama olmamış , statik olayı baya hoşuma gitti :) gerçi 505 kb oldu 5 kb lik program ama yine de oldu.

Peki linux da -lkutuphane şeklinde kütüphaneyi gösterdiğimizde, -static e bakıp mı karar veriyor, .a ları mı .so ları mı kullanacağını.
Çünkü windowsda hangi dinamik kütüphane kullanılırsa kullanılsın, onun lib uzantılı import kütüphanesini projeye eklemek gerekyior, doğrudan .dll ler eklenemiyor. Ya da kısaca şöyle sorayım. internetten bir kütüphane indirdin, resim çevirme ile ilgili, içinde sadece .so dosyası ve başlık dosyaları var. Bu kütüphane kullanılabilir mi yoksa mingw de olduğu gibi yine bir .a dosyası gerekli mi.
Eğer gerekli ise, windows dan tek farkı statik bağlama da yapabilmesi, gerekli değilse, tamamen farklı bir durum.
acehreli (Moderatör) #23
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
KUTALMIS:
Peki linux da -lkutuphane şeklinde kütüphaneyi gösterdiğimizde, -static e bakıp mı karar veriyor, .a ları mı .so ları mı kullanacağını

Evet. ld'nin belgesi, -lkutuphane yazıldığında normalde libkutuphane.a dosyası arandığını; sistemine göre libkutuphane.so da aranabildiğini söylüyor.

internetten bir kütüphane indirdin, resim çevirme ile ilgili, içinde sadece .so dosyası ve başlık dosyaları var. Bu kütüphane kullanılabilir mi

Benim bildiğim, yalnızca .so varsa, onunla yalnızca dinamik program yapabilirsin.

Ali
KUTALMIS #24
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam bu statik bağlanmış programları doğrudan kendi kernelimizde de kullanabiliyormuşuz, tabi bazı posix uyumlu sistem çağrıları şart (_exit, fork vb) Bir de elf loader tabiki. Ama bu yöntem işimi oldukça basitleştirecek.
Bir de gcc'yi kendi sistemine adapte etme veya herhangi bir C kütüphanesini kendi sistemin için derleme meselesi var ama çok daha meşakatli bir iş.
http://wiki.osdev.org/GCC_Cross-Compiler
http://wiki.osdev.org/Porting_Newlib
Bu mesaj KUTALMIS tarafından değiştirildi; zaman: 2010-04-28, 16:29.
canalpay (Moderatör) #25
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kutalmis Bey ile Ali Bey arasındaki bilgi alışverişi bittiğine göre bende merak ettiğim sorulara geri dönebilirim:

Ö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.

Burada ne demek istediğinizi açıkcası anlamadım. Çünkü abuzittin() diye işlev tanımlı değilse ne olursa olsun hata veriyor:

Örnek olarak deneme.d adlı bir dosyamız olsun ve içeriği şu olsun:
 
import sds; 
void main()
{  
  can();
 abuzittin();
  }

ve sds modülümüz şu olsun:

module sds;
 
void can()
{
    int a = 11;
}

Bunu istersek "dmd deneme.d" komutunu vererek, istersek "dmd deneme.d sds.d" komutunu vererek derleyelim şu şekilde hata veriyor:
deneme.d(5): Error: undefined identifier abuzittin
deneme.d(5): Error: function expected before (), not abuzittin of type int

Bundan ben şunları anlıyorum.

Derleyici import edilen bütün modüldeki işlevlerden ne olursa olsun haberdar. Ama derleyici verillen komutta modül ismi belirtilmiş mi yoksa belirtilmemiş mi haberdar değil. Bende neden haberdar değil. Sizce haberdar olması gerekmiyor mu diyorum.

Herhalde siz abuzittin işlevi desenizde hata almazsınız dediğinizde başka bir şey demek istediniz ve ben anlamadım.
"dinamik bir kütüphane import edersen ve rastgele işlev çağırırsan derleyici bu işlevin tanımlı olup olmadığını anlayamaz ve hata vermez. Ama en sonunda bağlayıcı bunu anlar ve hata verir." mi demek istediniz ?
KUTALMIS #26
Üye Mar 2010 tarihinden beri · 9 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bunu istersek "dmd deneme.d" komutunu vererek, istersek "dmd deneme.d sds.d" komutunu vererek derleyelim şu şekilde hata veriyor:
deneme.d(5): Error: undefined identifier abuzittin
deneme.d(5): Error: function expected before (), not abuzittin of type int

Bundan ben şunları anlıyorum.

Derleyici import edilen bütün modüldeki işlevlerden ne olursa olsun haberdar. Ama derleyici verillen komutta modül ismi belirtilmiş mi yoksa belirtilmemiş mi haberdar değil. Bende neden haberdar değil. Sizce haberdar olması gerekmiyor mu diyorum.

Herhalde siz abuzittin işlevi desenizde hata almazsınız dediğinizde başka bir şey demek istediniz ve ben anlamadım.
"dinamik bir kütüphane import edersen ve rastgele işlev çağırırsan derleyici bu işlevin tanımlı olup olmadığını anlayamaz ve hata vermez. Ama en sonunda bağlayıcı bunu anlar ve hata verir." mi demek istediniz ?

Deneme esnasında abuzittin işlevinin diğer modüllerde olup olmadığını derleyici bilemez, yani o işlevden kesinlikle haberdar değildir , bunu tekrarlıyorum. Sadece bağlayıcı ilgilenir bununla. Yani abuzittin işlevi hiç olmasa bile derleyici derler.

Sorunun sebebi ise farklı, c++ da, c99 da ve anladığım kadarıyla d'de de fonksiyonların prototipi verilmezse, dönüş değeri varsayılan olarak int kabul edilmiyor, ve C++ daki gibi d de de prototipi olmadığında hata oluşuyor.

Özetle, deneme modülünü
import sds; 
void abuzittin();
void main()
{  
  can();
 abuzittin();
  }

şeklinde derlerseniz (derlemekten kastım ,"dmd deneme.d -c " ) hatasız bir şekilde derlendiğini göreceksiniz.
Derleyici bu fonksiyonun olup olmadığı ile ilgilenmez, diğer modüllerde tanımlı olmasa da deneme.o ya bu fonksiyonun çağrısını yazar, ancak bağlama aşamasında, abuzittin işlevi bulunamadığından hata oluşur.

Özetle hata işlevin olmamasından değil, bildiriminin yapılmamasından kaynaklanıyor.
Bu mesaj KUTALMIS tarafından değiştirildi; zaman: 2010-05-01, 12:48.
canalpay (Moderatör) #27
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler. Tam dediğiniz gibi oldu.
acehreli (Moderatör) #28
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Walter Bright'ın bu konunun başlığına uygun bir yazısı:

  http://www.drdobbs.com/blog/archives/2010/05/improving_com…

Derleyici hata mesajları üzerine konuşuyor. Kısa notlar:

- Eskiden hatanın satırın hangi noktasında başladığını da söylüyormuş; yararsız gördüğü için kaldırmış

- Deyim sonlarındaki noktalı virgüller gibi aslında gereksiz olan yazım kurallarının derleyicinin hata vermesinde yardımı oluyormuş

- "uyumsuz tür" gibi kullanışsız mesajlar yerine "double beklerken int geldi" gibi açıklayıcı mesajlar daha iyi

- Hata bulunca devam edip etmeme konusunda birden çok yöntem var: ilk hatada dur, N hatada dur, ilk noktalı virgüle kadar gözardı et ve sonrasını derlemeye devam et, vs.

- Tanınmayan bir isim görüldüğünde yazım hatasıdır diye doğrusunu öner

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 09:37:51 (UTC -08:00)