Jump to page: 1 2
Thread overview
Kütüphane kullanımı
Nov 01, 2015
nurullahisrgan
Nov 03, 2015
zafer
Nov 03, 2015
agora
Nov 03, 2015
agora
Nov 04, 2015
zafer
Nov 04, 2015
zafer
November 02, 2015

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 02, 2015

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

P****eki 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.

Alıntı:

>

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.

Alıntı:

>

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.

Alıntı:

>

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.

Alıntı:

>

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);
	}
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

Alıntı (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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

Alıntı (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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

Alıntı (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.

Alıntı:

>

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 04, 2015

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_Windows) her şeyi çok güzel açıklamışlar.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2