Forum: Ders Arası RSS
Kütüphane kullanımı
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kütüphane kullanımı
Merhaba,

Kitabın Kütüphaneler bölümündeki yazılanlara göre bir kütüphane oluşturdum. Ancak bunu programda kullanmaya çalıştığımda hatalar alıyorum. test.a kütüphanem çalıştırılabilir dosya ile aynı dizinde olmasına rağmen test.d dosyası bulunamadı gibi bir hata alıyorum. Acaba atladığım bir yer mi var?
https://github.com/zafer06 - depo
nurullahisrgan #2
Üye Ock 2015 tarihinden beri · 76 mesaj · Konum: Mardin, Nusaybin
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım modülleri derleyicinin -I komutuyla, kütüphaneleri ise -L komutuyla tanıtmak gerekiyor. Bunlar kullandığında bazen libphobos2.a kutuphanesini eklemek zorunda kalabiliyoruz. En azından GtkD için öyleydi.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4515 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Biraz daha bilgi lütfen... :) Komut satırı nasıldı?

Bu arada, daha önce de söylemiş olabilirim ama o bölüme üç anahtar sözcük eklemiştim: deprecated, extern(), ve extern. (Bu soruyla ilgisi yok.)

Ali
zafer #4
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Peki o zaman, ancak işlem basamakları çok olduğu için adım adım anlatmaya çalışacağım. Öncelikle proje klasörümüze bir bakalım.

zafer@zafer-pc ~/Documents/kütüphane $ ls
kalori.d  main.d

Görüldüğü gibi main.d ve kalori.d isimli iki dosyadan oluşuyor. Benim yapmak istediğim kalori.d dosyasını kullanarak beslenme.a isimli bir kütüphane oluşturmak. Bunun için şöyle bir komut kullandım ve sonuçta proje klasörüm şu hale geldi.

zafer@zafer-pc ~/Documents/kütüphane $ dmd kalori.d -lib -ofbeslenme -w -de
zafer@zafer-pc ~/Documents/kütüphane $ ls
beslenme.a  kalori.d  main.d

Bu işlemler sonucunda beslenme.a isimli kütüphane dosyam oluşmuş oldu. Sonrasında oluşturduğum kütüphaneyi kullandığım için kalori.d dosyasını sildim ve projem şu hale geldi.

zafer@zafer-pc ~/Documents/kütüphane $ rm kalori.d
zafer@zafer-pc ~/Documents/kütüphane $ ls
beslenme.a  main.d

Projemi aşağıdaki komutlarla derlemeye çalıştığımda, böyle hatalar alıyorum. Sanırım eksik veya yanlış yaptığım bir yerler var ama neresi bulamadım? Yardımlar için şimdiden teşekkürler.

zafer@zafer-pc ~/Documents/kütüphane $ dmd main.d beslenme.a -w
main.d(2): Error: module kalori is in file 'kalori.d' which cannot be read
import path[0] = /usr/include/dmd/phobos
import path[1] = /usr/include/dmd/druntime/import

main.d dosya içeriği;
import std.stdio;
import kalori;
 
void main() 
{
    writeln("Kütüphane Test Projesi");
 
    Kalori kalori = new Kalori();
    double metabolikHiz = kalori.metabolikHizHesapla(86, 1.78, 25);
 
    writeln("Hesaplanan metabolik hiz: ", metabolikHiz);
}

kalori.d dosya içeriği;
module kalori;
 
class Kalori
{
    public double metabolikHizHesapla(double agirlik, double boy, int yas)
    {
        return 655 + (9.6 * agirlik) + (1.8 * boy) - (4.7 * yas);
    }
}
https://github.com/zafer06 - depo
agora #5
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Linkleme işlemi gerekiyo olabilirdi sanırım.

dmd -c main.d kalori.d

Sonra oluşan obj dosyalarını yine

dmd main.obj kalori.obj şeklindeydi.

Ayrıca -L ya da -I şeklindeydi.
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4515 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
zafer:
Sonrasında oluşturduğum kütüphaneyi kullandığım için kalori.d dosyasını sildim

Hata orada. kalori.d gibi modüller normalde iki işe yararlar:

  • Ne olanaklar sunduklarını tanımlarlar: yapılar, işlevler, alias'lar, vs.

  • O olanakların tanımlarını içerirler (buna rağmen, bazı modüllerde işlev tanımları bulunmak zorunda değildir; işlev tanımları başka bir dosyadan gelebilir)

Yukarıdaki iki görev C'nin başlıklarına benziyor: Örneğin, işlev bildirimleri barındırabilir ama işlev tanımları da olabilir.

beslenme.a dosyası yukarıdaki ikinci görevi üstlenir: Tanımlara sahiptir. Oysa, main.d'nin derlenebilmesi için bildirimlere de ihtiyaç var. Onu da 'import kalori;' satırı ile halletmek istiyor ama ne yazık ki silinmiş. :)

Bir başka deyişle, yalnızca şunu yazdığımızda birinci görev 'import' satırı ile halledilir ve ikinci görev bizim kalori.d'yi derleyiciye açıkça vermemizle halledilir:

dmd kalori.d main.d


Kısaca, kalori.d'yi silemeyiz. :)

Ali
agora #7
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali hocam bu link komutu ne işe yarar?

dmd kalori.obj main.obj

Ne iş görür? Okuldayım telefondan yazmak zor açıklayamamış olabilirim.
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4515 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
C, C++, D, vs. bazı diller program parçalarının ayrı ayrı derlenmelerine ve bu parçaların daha sonradan bir araya getirilerek programın oluşturulmasına izin verirler. Parçaların ayrı ayrı derlenmelerine İngilizce'de separate compilation denir.

Örneğin, yalnızca aşağıdaki işlev bildirimini içeren ama o işlevin tanımını içermeyen bir modül olsun:
module aritmetik;
 
int topla(int a, int b);
O modülü kendi programınıza 'import' ile eklediğinizde ve topla(1, 2) diye bir işlev çağırdığınızda derleyici yalnızca şunu bilir: topla() diye bir işlev varmış ve iki int alırmış; tamam, bu çağrıya izin veriyorum ve mikroişlemcinin yazmaçlarını vs. şu biçimde kullanarak kodu öyle bir işleve yapılan bir çağrı içerecek biçimde derliyorum.

Derleme işi bittiğinde kod içinde "topla() işlevine 1 ve 2 parametre değerleriyle bir çağrı yapılıyor" anlamına gelen çağrıdan başka bir şey yoktur.

Programı oluşturmak, bağlayıcının görevidir. O, böyle işlev çağrılarının karşılık geldikleri işlevlerin hangi program parçalarında veya kütüphanelerde bulunduğunu belirler, program parçalarını bir araya getirir, ve o çağrıları tam o işlev adreslerine yapar.

Bağlayıcının (linker) ve yükleyicinin (loader) bir sürü başka ayrıntısı var ama temel görevi budur.

Ali
Bu mesaj acehreli tarafından değiştirildi; zaman: 2015-11-04, 00:02.
zafer #9
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #6
acehreli:
Kısaca, kalori.d'yi silemeyiz. :)

Hımm, evet ama bu biraz garip değil mi? Yani benim elimde zaten kalori.d dosyası olacaksa beslenme.a kütüphanesini oluşturmaya neden uğraşayım?

Ali, statik kütüphane sisteminin böyle kullanıldığına emin misin? Yani eğer böyleyse kütüphane kullanımının ne anlamı kalıyor? Biraz daha araştırma yapacağım bence atladığımız veya açıklığa kavuşmayan bazı yerler var.
https://github.com/zafer06 - depo
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4515 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zafer:
benim elimde zaten kalori.d dosyası olacaksa beslenme.a kütüphanesini oluşturmaya neden uğraşayım?

Doğrusu, D'de zaten öyle yapmıyoruz. Bunun baş nedenlerinden birisi, hemen her yerde şablon olması ve şablonların her kullanıldıkları şablon parametre değerleri için farklı derlenmelerinin gerekmesi. Örneğin, sort() işlevi kütüphane olarak derlenemez çünkü örneğin kütüphane yazarının haberi olamayacağı BenimYapım diye bir türün nesnelerinin özel sıralanmalarını bilemez.

Genel olarak, kütüphanelerin en büyük yararı, kodun tekrar tekrar derlenmesini gereksiz kılması. Bir kere kütüphane dosyası oluştursak, onu kullanan N adet program doğrudan onunla bağlanıverir.

statik kütüphane sisteminin böyle kullanıldığına emin misin?

Ben böyle biliyorum. :-/ Aslında statik dosyalar derlenmiş kodların art arda birleştirilmelerinden başka bir şey değildir. Onun için Linux'ta ar (archive - arşiv) programı ile oluşturulurlar.

Ali
zafer #11
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler Ali, senin sayende D dilinde statik kütüphaneler konusunda bayağı bilgi sahibi oldum. Anladığım kadarıyla bu tip kütüphanelerini öncelikli görevi derleme süresini kısaltmak ancak buna büyük projelerde ihtiyaç duyarız ve bir çoğumuz zaten deneysel küçük kodlarla uğraşıyoruz.

kalori.d konusuna gelince D'de nasıl yapılıyor bilmiyorum :) ama ben kalori.d dosyasını silmenin yolunu buldum ;) Tabi senin dediğin gibi derleyicinin fonksiyon tanımlarına halen ihtiyacı var. Bunun için çözüm olarak .di dosyalarını kullanmışlar. Merak edip, öğrenmek isteyen olursa şu adreste (http://wiki.dlang.org/Compiling_and_linking_with_DMD_on_Wi…) her şeyi çok güzel açıklamışlar.
https://github.com/zafer06 - depo
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4515 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, .di dosyaları olayı C ve C++'taki başlık dosyalarına getiriyor. Nasıl .h dosyaları bildirimleri ve .c dosyaları tanımları içeriyorsa, .di dosyaları bildirimleri ve .d dosyaları tanımları içeriyor.

Tabii, C++'ta ve D'de şablonlar olduğundan .di dosyaları onların tanımlarını da içermek zorunda.

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:
Forum: Ders Arası RSS
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-10-23, 15:32:24 (UTC -07:00)