Include dosyaları nerede saklanır - Ubuntu Linux, GCC

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ı...

Çözüm

Buraya bakın: Arama Yolu

Özet:

#include 

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.

Yorumlar (0)

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 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.

Yorumlar (1)

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 
Yorumlar (0)