Arama butonu
Bu konudaki kullanıcılar: 1 misafir
10
Cevap
812
Tıklama
0
Öne Çıkarma
kütüphaneler için binary kavramı nedir?
B
12 yıl
Teğmen
Konu Sahibi

Merhaba arkadaşlar
C/C++ da lıbrary yani kütüphaneler için binary kavramı tam olarak nedir?
açıklarsanız çok sevinirim

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



G
12 yıl
Yarbay

Binary derken?

Derlenip objeye (.o) dönüşmüş olan kod dosyaları binary halindedir. Sonra bunlar paketlenir ve library (.lib, .a, .dll, .so) olur. Bundan mı bahsediyorsun?


Bu mesaja 1 cevap geldi.
M
12 yıl
Teğmen

Kutuphanelerden kastin baslik dosyalariysa onlarin binary ile bir iliskisi yok. Hic kutuphane kullanmadan da program yazabilirsin. Cunku kutuphanelerin icinde sadece fonksiyon, yapi ve siniflar vardir. Tabii makrolar ve bazi tanimlamalar da var ve bunlarin tek esprisi programciya kolaylik olsun diye hazirlanmis hazir kodlar olmasi. Kutuphane kullanmadigin durumda yapacagin her seyi tek tek tanimlanaman gerekir. Misal string kutuphanesini kullanmadan da pekala char pointer'lariyla string olusturabilirsin ama string kullanmak daha kolaydir.
Burdan anlayacagin butun olay derleyicide bitiyor.

if ( SART ) { 
Olumluysa
}
else {
Olumsuzsa
}
------------------------------------
if
( SART )
{
Olumluysa}else
{
Olumsuzsa
  }
------------------------------------
if ( SART ) {
Olumluysa
}
Olumsuzsa
------------------------------------
if ( SART ) {Olumluysa} else {Olumsuzsa}
------------------------------------
( SART ) ? (Olumluysa) : (Olumsuzsa)

Su orneklerin hepsi ayni isi yapar ve hepsi birbirinin aynidir. Yani kodunu hangi sekilde yazarsan yaz derleyici ayni sonucu verir. Bunun sebebi kodu derle dedikten sonra derleyicinin o kodu once optimize etmesidir. Misal if ornegi icin derleyiciyi yazan otorite bi takim testler yapip sistemde en cok randiman veren if tipini bulur. Ondan sonra derleyiciye "eleman nasil yazarsa yazsin sen butun if'leri suna cevir" der ve kodu oyle derler. Hayir ya benim yazdigim kodu kendi kafasina gore cevirmesin benim yazdigim sekilde derlensin diyorsan basina volatile keyword'unu yazarsin.

Ustte baslik dosyalarinin binary ile iliskisi yok yazmistim, aslinda sadece baslik degil, C veya C++'ta yazilmis programin okuma/yazma haricinde binary ile iliskisi hic yoktur. Derleyici kodu binary'i degil, elektro_gadget'in bahsettigi .o uzantili dosyalarda yazan hex kodlarina, yani derlenen mimariye ait assembly komutlarinin karsiligina cevirir. Finalde hangi sistemde calisacaksa ona ozel calistirilabilir dosya formatina cevrilir. (ornek .exe)

(.lib, .a, .dll, .so) dosya tipleriyle calistirilabilir dosya arasinda fark yok, tek fark tiklayinca calismiyor :)
Bu sekilde dosyalar cogu zaman calistirilabilir dosyanin boyutu buyuk olmasin diye yazilir. Bazende ayni islemleri kullanacak birden fazla uygulamaya o islemleri tek tek yazmaktansa yeri geldiginde bak iste orda(.lib, .dll vs.) yaziyor demek icin yazilir.

---
Yazmasam icim rahat etmiyecekti. Biri cikipta yeak yaa o dedigin gibi olmuyor demez umarim. Basit olsun diye oyle yazdim Yani mantigi bu sekilde desem daha iyi olur.





< Bu mesaj bu kişi tarafından değiştirildi Maybe Tomorrow -- 13 Haziran 2013; 20:48:14 >
Bu mesaja 1 cevap geldi.
B
12 yıl
Teğmen
Konu Sahibi

ayrıntılı cevaplarınız ve emekleriniz için teşekkür ederim arkadaşlar.
Sorumun çıkış noktası hem çok faydalı hemde benim için baş belası olan BOOST kütüphane dosyaları...
BOOST'un resmi sayfasındaki açıklamada 2 tür kullanımdan bahsedilmiş

1- Header-Only Libraries
Burada anladığım kadarıyla bir derleme yapmak gerekmiyor ve kütüphane dosyasını programıma eklemem yetiyor

#include <boost/lambda/lambda.hpp>


yazdığım programı şu şekilde derliyorum

g++ -I /boost_1_53_0 ornek_kod.cpp -o ornek_kod

buradaki 'kütüphane' sanırım arkadaşında bahsettiği başlık dosyası oluyor ve string.h da olduğu gibi sadece kütüphaneyi programıma eklemem yeterli oluyor

2- Build Boost
Burada bir örnek program içinde kullanmak istediğim

#include <boost/regex.hpp>


için şu ifade yer alıyor resmi sitede.

quote:

Programm uses the Boost.Regex library, which has a separetely-compiled binary component


sorum benim burada adı geçen library ve binary dir.
sonradan oluşturulan .so uzantılı dosyanın derleme esnasında programıma eklenmesi şu şekilde yapılıyor


g++ -I /boost_1_53_0 ornek_kod.cpp -o ornek_kod /boost_1_53_0/stage/lib/libboost_reggex.so

sorum bu iki farklı boost kütüphanesi neden teki direkt koda eklenirken diğerinde bu kadar zahmete giriyoruz. Aradaki fark nedir?





< Bu mesaj bu kişi tarafından değiştirildi beterman -- 14 Haziran 2013; 9:40:01 >
Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay

İster sadece başlık olsun, ister derlenmiş olsun hepsi kütüphanedir.

Eğer bu bir şablon (template) kütüphanesi ise derleyicinin kaynak kodunu görmesi gerekir. Bu yüzden kodlar derlenmeden başlık dosyası içinde servis edilir.

Mesela STL nin neredeyse tamamı başlık dosyası şeklinde. Neden öyle olmak zorunda dersen birçok sebebi var ama en önemlileri %100 tip uyumu, %100 taşınabilirlik sağlamak, optimizasyonu maksimuma çıkarmak, derleme zamanında hesaplanabilen ifadeler yazabilmek vs. Örneğin vector tanımlarken;

vector<Tür> nesne; şeklinde yazarız. Derleyici buradaki tür bildirimine bakar ve sanki sınıf o türle yazılmış gibi derler. Yani;

template <typename T>
class vector {
T ob;
...
};

bildirimi şu şekle getirir.

class vector {
Tür ob;
...
};

Derleyicinin bunu yapabilmesi için kaynak kodu görmesi şart.

Birde inline fonksiyonlar var. Derleyici fonksiyon çağrısını engellemek için fonksiyon kodunu direkt çağrıldığı yere açar. Bunu yapmak için de yine kodu görmesi şart. Fakat bu sadece optimizasyon amaçlı, şablonlar gibi gerekli değil.


Bu mesaja 1 cevap geldi.
B
12 yıl
Teğmen
Konu Sahibi

elektro_gadget boost konusunda kalabilirsek anlamam daha kolay olcak sanırım.
Boost tan benim anladığım programcıların işini kolaylaştırabilecek bir çok hazır kodu (kütüphaneyi) içermesidir.
Bu kütüphane dosyaları bekledindiği gibi .hpp uzantılı olarak indiriliyor.
Şu basit soruyu cevaplıyabilir misiniz?
Neden bazı dosyaları sadece #include yoluyla koduma eklemem yeterliyken diğer dosyaları binary'e (.so yada .a uzantılı dosyalar) çevirmem ve bunları
derleme esnasında linken yapmam gerekiyor ki?
Soru şu şekilde de sorulabilirdi? Bir kütüphane dosyasını direkt programa eklememle link etmem arasındaki fark nereden geliyor?


Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay

Boost, stl veya Qt fark etmez. Hepsinin sınıf şablonları başlık dosyaları içerisinde durur, öyle olmak zorunda. Gerekliliğini açıklamaya çalıştım ama sanırım şablon konusuna hiç çalışmamışsın bu yüzden anlamakta zorlanıyorsun.

Link işlemi her zaman gerekli ondan kaçış yok. Eğer kütüphane şablon şeklindeyse derleyici o şablona ve senin koduna göre tek kaynak kod üretir ve onu derler. Yani .hpp + .cpp -> class.cpp -> .o -> link (exe).

Kütüphane derlenmiş ise iki obje dosyası bağlanır. derlenmiş.o + (seninkod.cpp -> seninkod.o) -> link.


Bu mesaja 1 cevap geldi.
B
12 yıl
Teğmen
Konu Sahibi

quote:

Kütüphane derlenmiş ise iki obje dosyası bağlanır. derlenmiş.o + (seninkod.cpp -> seninkod.o) -> link.


kütüphanenin derlenip derlenmemesi onun şablon olup olmamasına mı bağlı? Çünkü en başa bakarsak bir derlenmemiş birde derlenmiş 'kütüphane' dosyası sözkonusu...


Bu mesaja 2 cevap geldi.
G
12 yıl
Yarbay

quote:

Orijinalden alıntı: beterman

kütüphanenin derlenip derlenmemesi onun şablon olup olmamasına mı bağlı?

Evet. Çünkü şablonlar adından da anlaşılacağı gibi tamamlanmış kod değildir, yani derlenmesi için gereken bütün bilgileri içermez.



M
12 yıl
Teğmen

quote:

Orijinalden alıntı: beterman

quote:

Kütüphane derlenmiş ise iki obje dosyası bağlanır. derlenmiş.o + (seninkod.cpp -> seninkod.o) -> link.


kütüphanenin derlenip derlenmemesi onun şablon olup olmamasına mı bağlı? Çünkü en başa bakarsak bir derlenmemiş birde derlenmiş 'kütüphane' dosyası sözkonusu...

quote:

Program uses the Boost.Regex library, which has a separetely-compiled binary component

Kutuphane iceriginde ekstradan ayri olarak sistem icin onceden derlenmis bir bilesen bulundurur.
Yada
Boost.Regex kutuphanesi icerisindeki kutuphane ogelerinden bir tanesi daha onceden derlenmistir.

Abi Turkce'ye cevirince anlamlar bile birbirine kayiyor, herhalde bu sekilde olmustur . Bu arada binary ile ilgili unuttugum cok onemli bir sey var. Ecnebiler final dosyalarina da binary diyolar.





< Bu mesaj bu kişi tarafından değiştirildi Maybe Tomorrow -- 14 Haziran 2013; 21:00:13 >
Bu mesaja 1 cevap geldi.
B
12 yıl
Teğmen
Konu Sahibi

quote:

Boost.Regex kutuphanesi icerisindeki kutuphane ogelerinden bir tanesi daha onceden derlenmistir


eger öyleyse bu kütüphaneyi kullanan bir programin derlenmesinde tekrar kütüphaneyi link etmeye gerek kaliyor mu?



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.