Alıntı (erdem):
>
- dmd ile kütüphane dosyalarını nasıl kullanıyoruz. Bu şekilde mi:
'$ dmd test.d -L-L/usr/lib -L-L/usr/local/lib -L-lSDL -L-ldl '
Evet, doğru görünüyor. (-L seçeneğine yazılanlar bütünüyle bağlayıcıya gönderilir.)
Alıntı:
>
- dmd linux'un paylaşılan kütüphane dosyalarını '*.so' uzantılı dosyalar kullanabiliyor mu. Kullanıyorsa nasıl.
so'larda uyum sorunları olabilir. .a'ların çalıştığını biliyorum. Deneyelim... /usr/lib klasörüme şöyle bir baktım ve gözüme libfontconfig.* diye kütüphaneler kestirdim.
Onunla ilgili bir başlık dosyası olduğunu düşündüğüm /usr/include/fontconfig/fontconfig.h dosyasını buldum. İçini açtım, D ilintilerini yazdım ve şöyle bir programla deneyeceğimi düşündüm:
struct _FcCharSet;
alias _FcCharSet FcCharSet;
extern(C) {
FcCharSet * FcCharSetCreate();
void FcCharSetDestroy (FcCharSet *fcs);
}
void main()
{
auto charSet = FcCharSetCreate();
scope(exit) FcCharSetDestroy(charSet);
// ...
}
Ne işe yaradığını bilmiyorum tabii. :) Amacım, herhangi bir C kütüphanesini D'den çağırmak. Programı oluşturdum:
'$ dmd deneme.d -ofdeneme -unittest -L-lfontconfig'
Bağlayıcı libfontconfig'i nereden bulduysa buldu; ve program hatasız oluşturuldu ve çalıştı:
'./deneme'
nm programını biliyor musun? Program kodlarının hangi sembolleri kullandıklarını gösterir. deneme programı üzerinde çağırıp 'Fc' içerenleri süzersek:
'$ nm deneme | grep Fc
U FcCharSetCreate
U FcCharSetDestroy
'
Satır başlarında U, "use"dan geliyor ve deneme'nin o işlevleri kullandığını söylüyor. nm çok yararlıdır. Bunu dene lütfen: D programını extern(C) belirteci olmadan oluşturmayı dene. Bağlayıcı hata verecek. Olsun... Program oluşamadı ama deneme.o oluştu. Bu sefer deneme.o'nun hangi sembolleri kullandığına bak:
'$ nm deneme.o | grep Fc
U _D6deneme15FcCharSetCreateFZPS6deneme10_FcCharSet
U _D6deneme16FcCharSetDestroyFPS6deneme10_FcCharSetZv
'
extern(C) denmediği zaman isimler işlev yükleme olanağını desteklemek için parametre türlerine göre oluşturuluyor.
nm bu konularda yararlı olur.
ldd'yi biliyor musun? O da dinamik kütüphane bağımlılıklarını gösterir. extern(C)'yi tekrar koyarak programı doğru olarak oluşturduktan sonra:
'$ ldd deneme
linux-gate.so.1 => (0xf7742000)
libfontconfig.so.1 => /usr/lib32/libfontconfig.so.1 (0xf76f6000)
librt.so.1 => /lib32/librt.so.1 (0xf76ed000)
libpthread.so.0 => /lib32/libpthread.so.0 (0xf76d3000)
libm.so.6 => /lib32/libm.so.6 (0xf76ad000)
libc.so.6 => /lib32/libc.so.6 (0xf7552000)
/lib/ld-linux.so.2 (0xf7743000)
libfreetype.so.6 => /usr/lib32/libfreetype.so.6 (0xf74db000)
libz.so.1 => /usr/lib32/libz.so.1 (0xf74c6000)
libexpat.so.1 => /lib32/libexpat.so.1 (0xf749f000)
'
deneme'nin hangi kütüphanelere bağımlı olduğunu görüyoruz.
Alıntı:
>
- dmd'nin varsayılan kütüphane dosyalarını aradığı klasör nerde. Belki bu kütüphane dosyalarını oraya kopyalayarak da olabilir.
Emin değilim ama dmd/linux/bin/dmd.conf dosyasında bir şeyler yazılı.
Alıntı:
>
- Önceki mesajlardan birinde Ali bey ilinti yazmaya (http://ddili.org/forum/thread/517) bir örnek vermişti. Orada oluşan '.o' uzantılı dosyaları (aslında bunlar C programın kaynak dosyaları) sadece başlık dosyalarını '.h' uzantılı dosyaları D'ye uyumlu hale getirerek bunları D programları arasından kullanabiliyorduk. Ben SDL'in son sürümünü indirdim ve '*.o' uzantılı dosyalar oluştu. Şimdi başlık dosyalarını da D'ye geçirirsek bunları kullanabilirmiyiz acaba.
Bence öyle. Ubuntu sistemimdeki rastgele bir kütüphane olan libfontconfig.so'yu kullanabildim.
Alıntı:
> Ama bunlardan herhalde bir 20 kadar var :-p
Bu işi kolaylaştırmak için şöyle bir proje var:
http://dsource.org/projects/bcd
D2 ile ne kadar uyumlu olduğunu bilmiyorum. Yine de işe yarayabilir.
Alıntı:
> Derlerken bu kadar dosyayı eklemeyi düşünemiyorum. Normalde gcc bunları '.so' uzantılı paylaşılan bir kütüphane yapıyor ve örneğin '-lSDL' dediğimizde bu '.o' uzantılı o kadar dosyanın birleşimini programa dahil edebiliyoruz. DMD'de böyle bir seçenek var mı bilmiyorum açıkçası.. Yani 'gcc' ile oluşturulan '*.so' uzantılı dosyaları DMD'de kullanabiliyor mu.
D'yi satarken "C kütüphanelerini olduğu gibi kullanabilir" diyoruz ya... ;)
Alıntı:
> Yukarda uğraştığım şeylerden bir sonuç alınmamasına şaşırmamak gerekir. Çünkü başlık dosyalarında sadece işlevlerin tanımları var. O işlevleri kullanabilmek için bir şekilde kaynak dosyalarını
o'lara da kaynak dosya deyince işler karışabilir diye ben "program parçası" demeyi seçmiştim.
deneme.c: kaynak dosya
deneme.o: program parçası
deneme: program
Alıntı:
> da programa dahil etmek gerekiyor. Yani bir şekilde kütüphane dosyalarını kullanabilmeliyiz.
Bakınız yukarıdaki deneme... :)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]