Giriş Giriş Giriş

C programlamada, bir program genellikle birden fazla kaynak dosyaları ve üst düzey dosyaların organizasyonu geliştirmek için bölünmüştür, yeniden kullanılabilirlik ve derleme hızı. Ancak, bu modülerlik bir meydan okuma sunar: bir üst düzey dosya değişiklikleri, ekleyen her kaynak dosyası, inşa işlemine bağlı olarak bu sorunu çözer. Masteringfiles ciddi bir C geliştirici için geçişin bir gecikmedir, ancak birçok yeni yükleme işlemine bağlı olarak bunları otomatikleştirin.

What Are Makefiles?

Bir Makefile, bir proje inşa etmek için bir dizi kural tanımlayan basit bir metin dosyasıdır.TheurFLT:0)[Döneticileri üretmek için kullanılan dosya süreleri,[Döntgenmeler, ve uygulama için gerekli komutları yerine getirmek gerekir.)[Döneticileri:2) Hedefler[Döneticileri oluşturmak için doğrular[Dönlendirmeler için kullanılabilir.)

Makefiles 1970'lerden beri Unix'in bir parçası olmuştur ve GNU Make, Linux ve MacOS'ta gerçeko standardıdır. Kelime söz konusu koncise ancak ince olabilir; bağımlılıklar doğru bir C geliştirici ihtiyacıdır.

Bağlanmalara bağlılık

C projesinde, bağımlılıklar, aşağıdaki dosyaların iade edilmesiyle sınırlı değildir.Her kaynak dosyası bir veya daha üst düzey dosyaları içerir (örneğin, [[Ahlak: 1).Eğer bir başlık değiştirilmişse, tümİLFLT:2 dahil dosyaların geri alınması gerekir. benzer şekilde, nesne dosyalarının hepsine bağlı olarak, nihai ek dosyaların hepsine bağlı olarak son derece kesin olarak bağlıdır.

Açıklama : Explicit vs Iklim Bağımlılığı

Erken Makefiles'te, programcılar tüm önkoşulları manuel olarak listelediler: Bir başlık oluşturmak, çok fazla şaşırtıcı rekompilleri listelemek anlamına gelir.Daha kötüsü, proje büyüdükçe, manuel listeler güvenilmez hale gelir. Modern çözüm, bağımlılıkları otomatik olarak üretmek, onları kapalı, makine kontrol edilebilir ön koşullara dönüştürmektir.

İyi bir şekilde tasarlanmış Makefile, birinci sınıf bir endişe olarak bağımlılıklara yol açıyor. Amaç asla yeniden inşa edilmeye ihtiyaç duyan bir şeyi yeniden inşa etmek ve her zaman her şeyi yeniden inşa etmek değildir.Bu, [Ücretsizliklerin özüdür:0) ve ).

Bir Makefile Temel Yapı

Tipik bir Makefile değişken tanımları, kurallar ve phony hedefleri içerir. İşte a az ama işlevsel bir örnek var. ” ve [[Döndüşüm: 4) ve [[Dönem:

CC = gcc
CFLAGS = -Wall -Wextra -O2

main: main.o utils.o
 $(CC) $(CFLAGS) -o main main.o utils.o

main.o: main.c
 $(CC) $(CFLAGS) -c main.c

utils.o: utils.c
 $(CC) $(CFLAGS) -c utils.c

clean:
 rm -f main main.o utils.o

Bu Makefile dört hedefi vardır: [[Döneticileri, iki nesne dosyaları ve bir filal hedef: 5 koloninin söylediğine göre bağımlılık hatları:0)[Döneticileri yeniden inşa etmeye karar vermeden önce kontrol etmek için dosyaların çekilmesi[FLT3).

Phony Targets

Ekranlar veya dosya isimleri ile karıştırın.([değiştir | kaynağı değiştir) ⁇ . ⁇ . ⁇ . ⁇ . ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

.PHONY: clean all

Bu olmadan, eğer bir dosya var olsaydı, [[Dönetici:0)) bunu güncel olarak görecek ve reçeteyi atlayacaktır.

Bağımlılıkların Etkili Bir Şekilde Yönetilmesi

Yukarıdaki manuel Makefile ciddi bir kusura sahiptir: ESRAT: 9'un bağımlılığı doğru, ancak başlıklarla ilgili ne? ”ŞUYGÜNÜT:15) değişiklikler, [[Üye ait olan, ancak kural yeniden inşa edilmelidir.

GCC ile Otomatik Bağlanma Üretimi

GCC (ve Clang) bayrakların ailesi tarafından bağımlılık bilgileri üretebilir. Çoğu proje için en pratik kombinasyon, [[Dönemli:)

  • [FONT:0] – derleme sırasında bağımlılık dosyası () yazar, sadece kullanıcı tanımlı başlıkları listeler listesi (sisteme başlık değil).
  • [FONT:0] - bağımlılık dosyasının adını belirtir.
  • [FONT:0] – her bir başlık için yanlış hedefler ekler, bir başlık kaldırıldığında hataları önler.

İşte bir Makefile'e otomatik bağımlılık izlemesini nasıl içerecek:

CC = gcc
CFLAGS = -Wall -Wextra -O2 -MMD -MP
SRCDIR = src
OBJDIR = obj
SRCS = $(wildcard $(SRCDIR)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
DEPS = $(OBJS:.o=.d)

all: myprogram

myprogram: $(OBJS)
 $(CC) $(CFLAGS) -o $@ $^

$(OBJDIR)/%.o: $(SRCDIR)/%.c
 @mkdir -p $(OBJDIR)
 $(CC) $(CFLAGS) -c $< -o $@

-include $(DEPS)

.PHONY: all clean
clean:
 rm -rf $(OBJDIR) myprogram

Açıklama : Explanation:

  • [FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=
  • [FONT: 27) Onları nesne dosya yollarına dönüştürür.
  • [FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=)
  • Şekil kuralı: 30.30. Her birFLT:31'i bir dosyaya derler ve [[DÜye Olmayanlar İçindekiler) bir yan etki olarak dosya üretirler.
  • HatFLT:34, üretilen [[Düzücüler/FİLMİNCİYLEŞİYÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ

Şimdi, eğerFL::38) değiştirilmişse, sonraki İZFLT:39'ların iptal edilmesi otomatik olarak yeniden işlenecektir, çünkü [[ŞUYGÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ

Gelişmiş Teknikler

Genrated Bağımlılığı Güvenli Bir Şekilde

Bir başlık silindiğinde, [[Dint: 00|Döneticileri, [Döneticileri 1] ve eksik bir hedef hatası ile başarısız olmak için, bayrak her bir bağımlılık başlığı için boş bir sahte kurallar ekleyerek bunu gider.

Kaynak Değişiklikleri Sonrası Bağımlılık Sistemleri

Bir incelik: Bir kaynak dosyası ekler veya bir İLDİYÜŞÜK/YÜKSÜRÜŞÜK İÇİN KAYNAKLARI: Çünkü dosya otomatik olarak ilk inşa edilen bir kez çalışır.

Order Kullanımı Sadece Önlemler

Bazen binadan önce var olan bir diziye ihtiyacınız var, ancak reçetesini tekrar başlatmak istemeyiz; alternatif şu:0) sipariş edilen ön koşullar) (daha önce|seçmiş)

$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
 $(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR):
 mkdir -p $@

Bu, dizinin herhangi bir derlemeden önce yaratıldığını sağlar, ancak dizinin kendisi için bir değişiklik (örneğin, içeride yeni bir dosya) yeniden ifade etmeye teşvik etmeyecektir.

Bağımlılık Yönetimi için En İyi Uygulamalar

  1. [FONT:0) Günden otomatik bağımlılık nesli kullanın.[DÜT:1] Tek bir filtre için bile, iyi bir alışkanlıktır. gelecekteki hataları hiçbir şey maliyeti yoktur ve engeller.
  2. [FONT:0) Kaynak dosyalarından ayrı bağımlılık dosyaları tut.) Onları bir İLFLT:53'de koyun veya [[DÜŞÜNCÜT:54) rehberi. Bu, kaynak ağacını temizlemek ve karıştırmaktan kaçınır.
  3. [FONT:0)Include the made (FONTD:0)Exp:0)Include the made (D)[FONTD:0)[FONTD:0)[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FO
  4. [FONT:0]Finansal hedefler için (Dönetici) kullanılmaktadır.[FONT:0)))) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  5. [FONT:0]Relep dosyaları, kaynak yönetmenleri ve dosyaların listeleri için değişkenler.[FONT:0) Bu, proje boyunca yeniden kullanılabilir hale getirmek ve özelleştirmek için daha kolay hale getirir.
  6. [FONT:0) Makefile'nizi kasıtlı bir başlık değişikliği ile test edin.[[DÜT:1] Bir başlık, runurFLT:63) ve sadece etkilenen nesne dosyalarının tekrar tekrar tekrarlanmasını onaylayın.Eğer tam bir yeniden inşa olursa, bağımlılık izleme ile bir şey yanlış.
  7. [FONT:0) Makefile'i basit tut, ancak gerekli değil. gibi gelişmiş fonksiyonlarla birlikte aşırı motorlama:64) Bu makalede gösterilen desenle baş başa çıkabiliyor; onlarca dosyaya iyi ölçekler.

Dış Kaynaklar

Anlayışınızı derinleştirmek için, bu yazara dayalı referanslara danışın:

  • [FONT:0)GNU Manual[[Dönetici: 1) Yapan, işlevleri ve gelişmiş özellikleri yapmak için kesin kılavuz.
  • [FONT=0)GCC Preprocessor Seçenekleri) - Dokümantasyon forurFLT:65|, [[TR:66|,END:67| ve ilgili bayraklar.
  • [FONT:0)Doğa Lambert tarafından yapılan bir eğitim[Dönem:0)- Birçok gerçek dünyayı kapsayan pratik, iyi yapılandırılmış bir öğretici vakaları kapsar.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

C programı Makefiles ile bağımlılıklar lüks değil, aynı zamanda tek bir dosyayı indiren herhangi bir proje için bir zorunluluktur.SeksDönetici kuralları, otomatik bağımlılık nesli ile birlikte:68) ve üretilen manuel bağımlılık listesini tekrar yazmayacaksınız. Öğrenmede yardımcı olmak için yatırım her zaman hızlı ve doğru bir şekilde ödeme sistemi oluşturabilirsiniz.Bu teknikleri burada manuel takip etmek, sadece sabit böcekleri merdivenle nesne dosyalarına neden olan.