Ben denedim ama pes ettim.
Önce, kişisel sorunlarım ve şikayetlerim:
- Aramızda kalsın ama dub'la aram bir çok nedenden ötürü hiç iyi değil. Nedenlerden birisi, bu tür programların kötü niyetli programların projelere sızmalarını çok kolaylaştırmaları: Ben tek modülü kullanmak istiyorum; o modül yüzlerce başka modülü getirebiliyor.
Başka bir neden, bu tür programların ne olup bittiğini programcıdan gizliyor olması. İşler yolunda gittiğinde herşey harika: 'dub init' diyorum mucizevi bir biçimde bir "projem" oluyor; 'dub add dsfml' diyorum ve mucizevi bir biçimde dsfml projeme ekleniyor; 'dub run' diyorum ve mucizevi bir biçimde program oluşuyor ve çalışıyor.
Ne yazık ki her zaman öyle olmuyor.
-
dub ne kadar kolaycı olmaya çalışsa da ve belki de en aptal programcıya bile yardım ediyor gibi görünse de, dsfml o derece uzmanlık bekliyor çünkü ne sfml'in nereden edinileceği ne de derleme sorunlarıyla bilgi içeriyor. Mucize gerçekleşecek ve her şey yolunda gidecek. Belki...
-
dsfml'in sitesinde dmd 2.068.2'yi görüyorum: http://dsfml.com/downloads.html Oldukça eski bir derleyici... Bu dsfml'in artık desteklenmediğini mi gösteriyor?
Başlayalım...
'
$ dmd --version
DMD64 D Compiler v2.088.0
'
Benim ki de eski ama bu saatten sonra 2.068.2'ye inmeyeceğim. Umarım çalışır... Bir klasör yapıp dub'a güveneceğim:
'
$ mkdir dsfml_deneme
$ cd dsfml_deneme/
$ dub init
Package recipe format (sdl/json) [json]: sdl
Name [dsfml_deneme]:
Description [A minimal D application.]:
Author name [Ali Çehreli]:
License [proprietary]:
Copyright string [Copyright © 2020, Ali Çehreli]:
Add dependency (leave empty to skip) []:
Successfully created an empty project in '/home/ali/personal/deneme/d/dsfml_deneme'.
Package successfully created in .
'
dsfml'in kendi sitesi kurulumu ile bilgi içermediğinden code.dlang.org'a gidip dsfml'i buluyorum:
https://code.dlang.org/packages/dsfml
Oradan öğrendiğim gibi projeme ekliyorum:
'
$ dub add dsfml
Adding dependency dsfml ~>2.1.1
'
dsfml'in sitesinden bir örnek program alıyorum:
http://dsfml.com/doc.html
Ve dub'ın oluşturduğu kaynağı onunla değiştiriyorum:
dsfml_deneme/source/app.d
Şu mübarek bayram gününde mucize bekliyorum (ama henüz sfml'in kurulmamış olduğu aklımda; onu sonra halledeceğim):
'
$ dub run
Fetching dsfml 2.1.1 (getting selected version)...
Performing "debug" build using /usr/bin/dmd for x86_64.
dsfml:system 2.1.1: building configuration "library"...
dsfml:audio 2.1.1: building configuration "library"...
dsfml:window 2.1.1: building configuration "library"...
dsfml:graphics 2.1.1: building configuration "library"...
dsfml:network 2.1.1: building configuration "library"...
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(142,13): Deprecation: initialization of immutable variable from static this is deprecated.
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(142,13): Use shared static this instead.
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(143,13): Deprecation: initialization of immutable variable from static this is deprecated.
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(143,13): Use shared static this instead.
dsfml 2.1.1: building configuration "library"...
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(142,13): Deprecation: initialization of immutable variable from static this is deprecated.
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(142,13): Use shared static this instead.
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(143,13): Deprecation: initialization of immutable variable from static this is deprecated.
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/network/ipaddress.d(143,13): Use shared static this instead.
'
Yukarıdaki uyarılar benim dmd'm daha yeni olmasından kaynaklanıyor.
Hiç olmazsa program derleniyor ve bağlayıcı (linker) hataları görüyorum. dub ve dsfml'in ortaklaşa hazırlamış oldukları komut satırında benim ortamımda bulunmayan kütüphane dosyaları var:
'
dsfml_deneme ~master: building configuration "application"...
Linking...
/usr/bin/ld: cannot find -ldsfmlc-audio
/usr/bin/ld: cannot find -ldsfmlc-system
/usr/bin/ld: cannot find -ldsfmlc-graphics
/usr/bin/ld: cannot find -ldsfmlc-window
/usr/bin/ld: cannot find -ldsfmlc-network
collect2: error: ld returned 1 exit status
'
Bu noktada yapılması gereken, bayramlık ağzımı kapalı tutup dsfml'i ve bu deneme klasörünü kaldırmak. Çünkü ben, gereken her şeyi yaptım: dub'a güvendim, projemi kurdum, dsfml'i buldum, gerektiği gibi kurdum ve aldığım hata, dsfml'in kütüphane dosyalarının bulunamadığı ile ilgili. Bitmiş olması gerek: söz verdiler; yapamadılar. Ümit devam ediyor. :)
O hata mesajları, sistemimde libdsfml-audio.so veya libdsfml-audio.a gibi dosyalar bulunması gerektiğini belirtiyor. (-l kullanılmışsa, başına lib gelir sonuna da ya .so ya da .a)
find marifetiyle önce /usr'ın altında arıyorum; bir şey bulamayınca dub'ın dosyalarının ~/.dub klasöründe olduklarını hatırlayarak home klasörümde arıyorum:
'
$ find ~ | grep 'dsfml.*.so'
'
Adında dsfml geçen ve sonu .so diye biten dosya yok. .a arayalım:
'
$ find ~ | grep 'dsfml.*.a'
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/libdsfml_audio.a
[...]
'
Anlaşıldı: Dinami dosya değil, .a kullanmışlar. Ancak, burada büyük bir sorun var: dosya adları bağlayıcının hata mesajından anladığımız gibi değil: Hata mesajında tire var, dosya adında alt çizgi. Acaba dsfml'de bir değişiklik mi oldu? Acaba eskiden bir türlüydü de şimdi başka türlü mu?
Ama olaya bakın: dub'ın sözüyle yola çıktım; tanımadığım projelerin dosyaları arasında doğruyu arıyorum. Yuh!
Deneme projemin klasörü içine hata mesajındaki dosya isimlerine uygun symbolic link'ler oluşturuyorum. Örnek:
'
$ ln -s /home/ali/.dub/packages/dsfml-2.1.1/dsfml/libdsfml_audio.a libdsfmlc-audio.a
'
Saf ben: Buradaki kütüphaneler proje oluşturulurken normalde kullanılmaz ki; Linux zararlı olabilen kütüphanelerin haberimiz olmadan bağlanmalarını önlemek için ancak sistem klasörlerini (veya dub'ın söylediği yerlerdeki) kütüphaneleri kullanılır.
Bu noktada dub'ı geride bırakıyorum ve kendime yeni bir klasör oluşturup içine bir Makefile koymaya karar veriyorum.
Ama önce sfml'i kurayım. Bir şekilde onun pakedinin adını öğreniyorum ve sistemime kuruyorum (gereken yerde Y ve Enter ile):
'
sudo apt-get install libsfml-dev
'
Denediğim Makefile şu:
'
deneme:
dmd -I/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src
app.d
-L-L/home/ali/.dub/packages/dsfml-2.1.1/dsfml
-L-ldsfml
-L-ldsfml_audio
-L-ldsfml_graphics
-L-ldsfml_network
-L-ldsfml_system
-L-ldsfml_window
-L-lsfml-audio
-L-lsfml-graphics
-L-lsfml-network
-L-lsfml-system
-L-lsfml-window
'
İşler çok daha iyi giderken bağlayıcı yeni bir hata gösteriyor:
'
/home/ali/.dub/packages/dsfml-2.1.1/dsfml/src/dsfml/audio/sound.d:55: undefined reference to `sfSound_construct'
'
O satıra gidince sfSound_construct diye bir işlev çağrıldığını görüyorum. Ancak, o işlev sfml ile gelen kütüphanelerin hiçbirisinde geçmiyor.
Bu noktada pes ediyorum ve bu mesajı yazıyorum. :)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]