Yani, aşağıdakileri yaptığımızda:
#include <stdio.h>
karşı
#include "myFile.h"
Derleyici, benim durumumda GCC, stdio.h dosyasının (ve hatta nesne dosyasının) sabit diskimde nerede olduğunu biliyor. Benim herhangi bir müdahalem olmadan sadece dosyaları kullanır.
Ubuntu Linux makinemde dosyaların /usr/include/
adresinde depolandığını düşünüyorum. **Derleyici bu dosyaları nerede arayacağını nasıl biliyor? Bu yapılandırılabilir mi yoksa bu sadece beklenen varsayılan mı? Bu yapılandırma için nereye bakmalıyım?
Bu include dosyaları hakkında bir soru sorduğuma göre, dosyaların kaynağı nedir? Bunun Linux topluluğunda bulanık olabileceğini biliyorum ama bunları kim yönetiyor? Bir Windows derleyicisi için aynı dosyaları kim sağlar ve yönetir.
Ben her zaman derleyiciyle birlikte geldiği izlenimine kapılmıştım ama bu bir varsayımdı...
Buraya bakın: Arama Yolu
Özet:
#include <stdio.h>
Include dosyası parantez içinde olduğunda, önişlemci ilk olarak -I bayrağı ile belirtilen yollarda arama yapar. Daha sonra standart include yollarını arar (yukarıdaki bağlantıya bakın ve sisteminizde test etmek için -v bayrağını kullanın).
#include "myFile.h"
Include dosyası tırnak içinde olduğunda, önişlemci önce geçerli dizinde, sonra -iquote ile belirtilen yollarda, sonra -I yollarında, sonra da standart yollarda arama yapar.
Önişlemcinin standart yolları aramasını önlemek için -nostdinc kullanılabilir.
Ortam değişkenleri de arama yolları eklemek için kullanılabilir.
Derleme sırasında -v bayrağını kullanırsanız kullanılan arama yollarını görebilirsiniz.
gcc, görevlerini yerine getirmek için birçok başka programı çağıran zengin ve karmaşık bir "orchestrating" programıdır. Özellikle #include "goo"
ve #include <zap>
programlarının sisteminizde nerede arama yapacağını görmek için tavsiye ederim:
$ touch a.c
$ gcc -v -E a.c
...
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-apple-darwin9/4.0.1/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
# 1 "a.c"
Bu, #include "..."
'un bakacağı ancak #include <...>
'un bakmayacağı dizinler de dahil olmak üzere (varsa) dahil edilen dosyalar için arama listelerini görmenin bir yoludur. Gösterdiğim bu özel liste aslında Mac OS X (Darwin olarak da bilinir) üzerinedir, ancak önerdiğim komutlar size arama listelerini (ve burada ...
ile değiştirdiğim ilginç yapılandırma ayrıntılarını;-) gcc'nin düzgün çalıştığı herhangi bir sistemde gösterecektir.
Karl arama yolu sorunuzu yanıtladı, ancak "dosyaların kaynağı" ile ilgili olarak, bilmeniz gereken bir şey, libfoo
paketini yüklerseniz ve onunla biraz geliştirme yapmak istiyorsanız (yani, başlıklarını kullanmak), libfoo-dev
paketini de yüklemeniz gerekecektir. Gördüğünüz gibi standart kütüphane başlık dosyaları zaten /usr/include
içinde bulunmaktadır.
Çok sayıda başlık içeren bazı kütüphanelerin bunları bir alt dizine yükleyeceğini unutmayın, örneğin /usr/include/openssl
. Bunlardan birini dahil etmek için, örneğin /usr/include
kısmı olmadan yolu sağlamanız yeterlidir:
#include <openssl/aes.h>