Statik ve Dinamik Kütüphanelerin Beraber Kullanılması
Bazı kütüphanelerin hem statik hem de dinamik halleri bulunabilmektedir. Bağlayıcı seçim olanağı varsa dinamik kütüphaneleri seçmektedir. Örneğin, kütüphanenin -lXXX şeklinde gösterilmesi durumunda, bağlayıcı libXXX.a dosyasını değil libXXX.so dosyasını seçmektedir.
Bazı durumlarda dinamik kütüphaneler yerine statik hallerini kullanmayı tercih edebiliriz. Bir örnek üzerinden bu durumu inceleyelim.
driver.c:
foo.c:
bar.c:
foo ve bar için sırasıyla statik ve dinamik kütüphaneler oluşturalım.
Uygulamayı aşağıdaki gibi derlediğimizde kütüphanelerin dinamik hallerinin seçildiğini görmekteyiz.
Statik kütüphanelerin seçilmesi için aşağıdaki yöntemler uygulanabilir.
1.
Kütüphane ismi tam adıyla kullanılabilir.
2.
gcc, -static seçeneği kullanılabilir.
Bu durumda uygulamanın dinamik bir bağımlılığı olmadığını görüyoruz. Bu seçeneğin kullanılabilmesi için tüm kütüphanelerin statik hallerinin bulunması gerekmektedir. Bu durumu test etmek için bar kütüphanesinin statik halinin olmadığını varsayalım, libbar.a dosyasını silip uygulamayı yeniden derlemeye çalışalım.
Bağlayıcının yaptığı işlemlere daha yakından bakmak için --verbose seçeneğini kullanabilirsiniz.
Bağlayıcının libfoo.a dosyasını bulamadığını ve nerelerde arama yaptığını görmekteyiz.
3.
Tüm uygulamayı statik olarak derlemek yerine, bağlayıcının istenilen kütüphanelerin statik hallerini kullanması sağlanabilir. Statik halleri kullanılmak istenen kütüphaneler -Wl,-Bstatic -lXXX -lYYY -Wl,-Bdynamic şeklinde gösterilebilir. Bu durumda foo kütüphanesinin statik, bar kütüphanesinin ise dinamik halini kullanabiliriz.
Bağlayıcı Bstatic seçeneğini gördüğünde Bdynamic seçeneğini görene kadar yalnız statik kütüphaneleri kullanmaktadır, statik kütüphane bulunamaması durumunda dinamik hali kullanılmamaktadır.
Last updated
Was this helpful?