C++ header dosyaları ve linklemeyle ilgili bir soru

Arkadaşlar c++ da include preproccesor direktifi ile header dosyalarını ekliyoruz da neden linklememiz gerekiyor ?
preproccesor o header dosyasıyla bizim dosyamızı birleştirmiyor mu zaten?

mesela

a.h diye bir dosyayı a.cpp dosyasına dahil ettiğimizde
text olarak a.h deki kodlar ile a.cpp deki kodlar birleştiriliyor
peki ne gerek var linklemeye veya linklemek ne işe yarıyor zaten bu iki dosya birleşik oluyor
:confused:
mesela a.h de olan bir şeyi a.cpp de kullanmaya çalışınca hata veriyor!
:neutral_face:
eğer linklemezsek tabi
mesela curses modülünü linkleyelim
g++ main.cpp -o main -lcurses

Linklenen sey header dosyasi degil, header’in deklarasyonlarini yaptigi icerigin kendisini iceren obje dosyasi (veya kutuphane).

Tanimlamalar (fonksiyonun icerigi veya degiskenin degeri) header dosyasindaysa linklemeye gerek yok. Hatta her include eden compilation unit’in ayri kopyasi olmasini istemiyorsan ugrasman lazim.

Kodunu birbirini cagiran iki ayri .cpp dosyasina (compilation unit’e) bolup calistirmayi denersen baya deneyim ve bilgi edinebilirsin. (Sonrasinda da bunlara ucuncu bir arkadas ekleyip statik ve dinamik library’ler olarak kullanmak var.)

3 Beğeni

mesela curses modülünde -lcurses dediğimizde
curses.h dosyasını linklemiyor mu?.. sanırım anlamadım :disappointed: :confused:
ayrı bir curses.o mu var ?

bu ne demek hocam? :neutral_face:


sanırım baya eksiğim, eksiklerim var :frowning:

@aib sana odev veriyor. Kendin arastirdiktan sonra sormalisin. Cunku o her zaman olmayacak. Bize kendi kendimize ogrenmeyi ogretiyor. Cok felsefi bir mevzu, tum gece bunu dusunecegim galiba.

Ogretmenin gorevi ogretmektir. Ama gercek bir ogretmen, ogrenmeyi ogretir. Ogrencisine hayati boyunca kullanabilecegi bir yetenek verir. Cunku ogrenme omur boyudur. Yani gercek bir ogretmen, bize kendi bildiklerinden daha fazlasini ogretir. Muthis, muthis, muthis bir hediye. Tesekkur ederim.

5 Beğeni

sanırım anlamadığım şey header ile library yi karıştırmamdı
birisi bu kafa karışıklığı gidermek için

*  The header is a phone number you can call, while...
*  ...the library is the actual person you can reach there!

böyle bir şey söylüyor biraz anladım gibi :thinking:
header dosyası library dosyasının deklarsyonlarını içeriyor bu yüzden headerı include etsek de o library dosyasını linklemek gerekiyor
sanırım anladım saolun hocam @aib :relaxed:

Gecenlerde birisi bir C++ tutoryalinden bahsederken “modul” demisti. Tutoryal “compilation unit” yerine baska herhangi bir terim kullaniyorsa kosarak kacilmasi gerektigini soylemistim. :slight_smile: (Sen oldugunu, veya en azindan takip ettigin bir baslik oldugunu varsayiyorum—forumda cok fazla C++ basligi yok.)

Sebebi tam olarak bu aslinda. Compilation unit’in ne oldugunu bilen birinin bu soruyu yanitlamasi cok kolay. Ogrenmenin/baslamanin en kolay yolu da iki tane compilation unit yaratip birbirine baglama.

Daha odev veriyorum: Compilation unit’leri -c ile compile edip cikan obje dosyalarini ucuncu bir komut ile linkleme. -c ve -E opsiyonlarinin ne yaptigini ogrenme.

Bu arada butun bunlar C icin de gecerli. Hatta .c dosyalariyla yapmak daha kolay olabilir.


Ogrenmeyi ogrettigimden emin degilim ama soylediklerine kesinlikle katildigim icin insanlari bu sekilde yonlendiriyorum sanirim. Tesekkur ederim :blush:

3 Beğeni

tamamdır hocam ödeve geçiyim.
:blush:

1 Beğeni