Forum: Ders Arası RSS
D Kütüphane (LIB) Dosyası Oluşturmak
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D Kütüphane (LIB) Dosyası Oluşturmak
Merhaba,

Son günlerde GtkD, SDL derken kütüphaneler ile içli dışlı olup ilinti yazmaya başladık. İster istemez, D'de yazdığımız bir kodu diğer dillerden kullanılabilmesi için nasıl kütüphane yazmamız gerektiğini merak ediyor insan. Aslında bu konuda, çektiğiniz her DMD paketi içindeki samples dizininde, mydll isminde bir örnek var. Ama deneyip tecrübe edelim mi? Öğrencek çok şeyimiz olabilir ki eğer forumda tartışılmadıysa işte şimdi tam vakti...:)

Geçen gün Erdem'den öğrendiğim kadarıyla DMD eski bir bağlayıcı (OptLink) kullanıyormuş ama Borland ile uyumlu olduğu için SDL'nin Borland ile derlenmiş LIB dosyalarını kullanıyormuşuz. Kendi LIB dosyalarımız için ise sanırım, core.sys.windows.dll sınıfını çağırarak Dllmain() işlevi oluşturmak ve modüller ile birlikte derlemek gerekiyor. Neticede iki OBJ (biri kütüphaneyi derlerken) bir de LIB dosyası oluşuyor. İkinci derlemede de EXE oluşurken DLL ile birlikte çalışıyormuş. Aslında DLL'de EXE boyutlarında bir dosya oluyor ve o da bir uygulama; herhalde runtime'ı olmayan bir uygulama?

Bakınız bahsettiğim örneğin dosyaları şöyle:
"mydll.d":
module mydll;
import std.c.stdio;
 
export void dllprint() { printf("hello dll world\n"); }

"mydll.def":
LIBRARY "mydll.dll"
EXETYPE NT
SUBSYSTEM WINDOWS
CODE SHARED EXECUTE
DATA WRITE

"dll.d":
import std.c.windows.windows;
import core.sys.windows.dll;
 
__gshared HINSTANCE g_hInst;
 
extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) {
    switch (ulReason) {
        case DLL_PROCESS_ATTACH:
            g_hInst = hInstance;
            dll_process_attach( hInstance, true );
            break;
        case DLL_PROCESS_DETACH:
            dll_process_detach( hInstance, true );
            break;
        case DLL_THREAD_ATTACH:
            dll_thread_attach( true, true );
            break;
        case DLL_THREAD_DETACH:
            dll_thread_detach( true, true );
            break;
    default:
        assert(0);
    }
    return true;
}

Bunları ise şu şekilde derliyormuşuz:

dmd -ofmydll.dll -L/IMPLIB mydll.d dll.d mydll.def

Neyicede ortaya bir OBJ, bir LIB ve de bir DLL dosyası çıkıyor. Kısaca şu kod ile de deneyebiliyoruz:

"test.d":
import mydll;
 
int main()
{
    mydll.dllprint();
    return 0;
}

Derlemek için ise genelde yaptığımız gibi şöyle yapıyoruz:

dmd test.d mydll.lib

En son mydll.dll dosyasının uzantısını exe yaparak çalıştırmayı denedim de "geçerli bir Win32 uygulaması değil" şeklinde bir uyarı aldım. Sanırım bizim başlangıçta çalışan main() işlevi bu DLL içinde bulunmadığı için böyle oluyor. Belkide dll.d dosyası yapısını değiştiriyor.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-08-13, 13:08.
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sanırım bir de mydll.di mı oluşturmak gerekiyor. Burada windows altında dll oluşturmayı anlatıyor.

http://dlang.org/dll.html

Ama kişisel olarak artık Microsoft cephesinde uygulama yazmak bana itici gelmeye başladı  :-/

Bunun nedeni ise örneğin benim aldığım bilgisayar Intel'in yeni çıkan ana kartlarından bir tanesini kullanıyor. Ama öyle bir şey ki sadece Windows 7 desteği veriyorlar. XP desteği sorunlu. Hazırladıkları ekran sürücüsü ile basit bir uygulamayı bile çalıştıramıyorum.

Bu yüzden Richard Stallman'ın özgür donanım derken ne demek istediğini çok daha iyi anlıyorum. Intel ve Microsoft anlaşıp benim özgür işletim sistemi seçme hakkımı almaya çalışacaksa ben de onların işletim sistemi için program yazmam. Ya da gider Apple kullanırım!

Windows'un ustasıyım, linux'un hastasıyım!  :-D
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet, .di uzantılı bir dosya da vardı...

erdem:
... Intel ve Microsoft anlaşıp benim özgür işletim sistemi seçme hakkımı almaya çalışacaksa ben de onların işletim sistemi için program yazmam. Ya da gider Apple kullanırım!

Windows'un ustasıyım, linux'un hastasıyım!  :-D
:-D
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
erdem:
Sanırım bir de mydll.di mı oluşturmak gerekiyor.
Bu dosyanın uzantısını .dil yaptım ve tüm DLL, EXE, LIB ve OBJ dosyalarını silip tekrar derledim. Sonuçta bir şey değişmedi. Hatta .def dosyasına kesin ihtiyaç olduğundan da emin değilim... :rolleyes:
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
agora #5
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Eski bir konu ama meraklilari olabileceginden guncelliyorum ben de soruyorum. Ozur dilerim yanlis yaptiysam :)

simdi normal bir modul ile, olusturulan lib dosyalari arasinda ne fark var?

dmd -H dosya.d

ile .di dosyasi olusturuluyor. DLL ile .di dosyasi arasindaki fark nedir?

bir de

dmd -lib lib.d

ile de .lib dosyalari olusturuluyor. bunun modul, .di ve .dll arasindaki fark nedir? burada biraz kafam karisti da.

Bu soruyu sadece o anda gelistirilen program icin soruyorum. Yoksa kimi lib dosyalarini kullanima sunduktan sonra da kullanan programlar var.
acehreli (Moderatör) #6
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ı
agora:
DLL ile .di dosyasi arasindaki fark nedir?

C gibi dillerde kütüphaneler iki parçadan oluşur: Kütüphanenin sunduğu olanakların derlenmesinden oluşan asıl kütüphane dosyası (.lib, .dll, .a, .so, vs.) ve o olanakların bildirimlerinden oluşan başlık dosyası.

Örnek C kütüphanesi:
// foo.c
int topla(int a, int b)
{
    return a + b;
}
O kütüphanenin başlık dosyası:
// foo.h
int topla(int a, int b);
D'de olay aynı değil: Yalnızca modülü yazıyoruz ve hem bildirimler için hem tanımlar için kullanıyoruz. Buna rağmen, D'de de işlevleri kütüphane içine derlemek ve başlık dosyasının benzeri bir dosya sunmak istenebiliyor.

O iş için .di dosyaları var: .di, bir modülün olabilen bütün tanımlardan arınmış halidir.

dmd -lib lib.d

ile de .lib dosyalari olusturuluyor.

Hangi dilde olursa olsun, kütüphane şudur: Derlenmiş kodların bir araya getirilmiş hali. Yukarıdaki komut lib.d'yi derler ve derlenmiş kodları kütüphane dosyası olarak bir araya getirir. Bu o kadar basit bir kavramdır ki, Unix'ten bildiğimiz .a dosyaları temelde derlenmiş kodların yan yana yerleştirilmesinden başka bir şey değildir.

Ali
agora #7
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Anladim hocam tesekkur ederim. di dosyasi uretince linux altinda ayrica bir executable dosya uretiyor. windows da ayni. saniyorum sizin de demek istediginiz bu. yani olanaklardan arinmasi olayi. cunku o executable olarak cikan dosyalar calistirilmiyor
acehreli (Moderatör) #8
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ı
agora:
di dosyasi uretince linux altinda ayrica bir executable dosya uretiyor.

Benim ondan haberim yoktu. Baktım: üretilen executable, bildiğimiz programın kendisi. Dolayısıyla, -H'in anlamı "yalnızca .di üret" değil, ".di de üret" imiş. Öğrenmiş olduk.

yani olanaklardan arinmasi olayi.

.di'nin içine bakınca öyle olduğu görülüyor. Örneğin, işlevlerin tanımları (definition) yok, bildirimleri (declaration) var.

cunku o executable olarak cikan dosyalar calistirilmiyor

Denedim, çalışıyor. Bildiğimiz programın kendisi. :)

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-11-18, 07:45:02 (UTC -08:00)