c makefile tutorial
Bu C ++ Makefile eğitiminde, C ++ 'daki avantajları ve uygulamaları da dahil olmak üzere Make aracının ve makefile'ın ana yönlerini tartışacağız:
Herhangi bir C ++ projesinde, önemli hedeflerden biri, tüm bağımlılıkları ve proje dosyalarını tek bir yerden alıp tek seferde yürütmek için projenin oluşturulmasını basitleştirmek ve böylece tek bir komutla istenen çıktıyı elde etmektir.
yazılım geliştirme yaşam döngüsündeki aşamalar
Aynı zamanda, proje dosyalarından herhangi biri değiştirildiğinde, tüm projeyi yeniden oluşturma zahmetine girmemize gerek kalmaz, yani projede bir veya iki dosya değiştirildiğinde, yalnızca bu değiştirilen dosyaları yeniden oluştururuz ve sonra devam ederiz. infaz ile.
=> Kolay C ++ Eğitim Serisini Okuyun.
Bunlar, C ++ 'da 'make' aracı ve 'makefiles' tarafından ele alınan özelliklerdir. Bu eğitimde, makefile dosyalarının tüm önemli yönlerini ve bunların C ++ 'daki uygulamalarını tartışacağız.
Ne öğreneceksin:
Aracı Yap
Make bir UNIX aracıdır ve bir projenin farklı modüllerinden yürütülebilir oluşturmayı basitleştirmek için bir araç olarak kullanılır. Makefile'da hedef girdiler olarak belirtilen çeşitli kurallar vardır. Yapma aracı tüm bu kuralları okur ve buna göre davranır.
Örneğin, bir kural herhangi bir bağımlılık belirtiyorsa, bu durumda make aracı derleme amacıyla bu bağımlılığı içerecektir. Make komutu makefile'da modüller oluşturmak veya dosyaları temizlemek için kullanılır.
Make'in genel sözdizimi şöyledir:
%make target_label #target_label is a specific target in makefile
Örneğin , dosyaları temizlemek için rm komutlarını yürütmek istersek şunu yazarız:
% make clean #here clean, rm komutları için belirtilen bir hedef_etikettir
C ++ Makefile
Makefile, hedefleri oluşturmak için 'make' komutu tarafından kullanılan veya başvurulan bir metin dosyasından başka bir şey değildir. Bir makefile ayrıca her dosya için kaynak düzeyi bağımlılıkları ve yapı sırası bağımlılıkları gibi bilgileri içerir.
Şimdi makefile'ın genel yapısına bakalım.
Makefile tipik olarak değişken bildirimlerle başlar ve ardından belirli hedefler oluşturmak için bir dizi hedef girdisi gelir. Bu hedefler .o veya C veya C ++ 'daki diğer yürütülebilir dosyalar ve Java'daki .class dosyaları olabilir.
Ayrıca, hedef etiket tarafından belirtilen bir dizi komutu yürütmek için bir dizi hedef girişimiz olabilir.
Dolayısıyla, genel bir makefile aşağıda gösterildiği gibidir:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Makefile'ın basit bir örneği aşağıda gösterilmiştir.
# a build command to build myprogram executable from myprogram.o and mylib.lib all:myprogram.o mylib.o gcc –o myprogram myprogram.o mylib.o clean: $(RM) myprogram
Yukarıdaki makefile'da iki hedef etiket belirledik, ilki myprogram ve mylib nesne dosyalarından çalıştırılabilir oluşturmak için 'tümü' etiketidir. İkinci hedef etiket 'temizle', 'myprogram' adındaki tüm dosyaları kaldırır.
Makefile'ın başka bir varyasyonunu görelim.
# the compiler: gcc for C program, define as g++ for C++ CC = gcc # compiler flags: # -g - this flag adds debugging information to the executable file # -Wall - this flag is used to turn on most compiler warnings CFLAGS = -g -Wall # The build target TARGET = myprogram all: $(TARGET) $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c clean: $(RM) $(TARGET)
Yukarıdaki örnekte gösterildiği gibi, bu makefile'da kullandığımız derleyici değerini içeren 'CC' değişkenini kullanıyoruz (bu durumda GCC). Başka bir değişken 'CFLAGS', kullanacağımız derleyici bayraklarını içerir.
Üçüncü değişken 'TARGET', kendisi için yürütülebilir dosyayı oluşturmamız gereken programın adını içerir.
Makefile'ın bu varyasyonunun ölçü avantajı, derleyici, derleyici bayrakları veya çalıştırılabilir program adında bir değişiklik olduğunda sadece kullandığımız değişkenlerin değerlerini değiştirmemiz gerektiğidir.
Make Ve Makefile Örneği
Aşağıdaki dosyaları içeren bir program örneğini düşünün:
- Main.cpp: Ana sürücü programı
- Point.h: Nokta sınıfı için başlık dosyası
- Point.cpp: Puan sınıfı için CPP uygulama dosyası
- Kare.h: Kare sınıf için başlık dosyası
- Square.cpp; Kare sınıf için CPP uygulama dosyası
Yukarıda verilen .cpp ve .h dosyalarıyla, .o dosyaları oluşturmak için bu dosyaları ayrı ayrı derlememiz ve ardından bunları main adlı yürütülebilir dosyaya bağlamamız gerekir.
Bundan sonra bu dosyaları ayrı ayrı derleyeceğiz.
- g ++ -c main.cpp: main.o üretir
- g ++ -c point.cpp: bir nokta oluşturur. o
- g ++ -c square.cpp: kare oluşturur. o
Ardından, yürütülebilir main'i oluşturmak için nesne dosyalarını birbirine bağlarız.
g ++ -o main main.o point.o square.o
Ardından, programın belirli bölümleri güncellendiğinde dosyalardan hangisini yeniden derlememiz ve yeniden oluşturmamız gerektiğine karar vermemiz gerekiyor. Bunun için bir bağımlılık tablosu bu uygulama dosyalarının her biri için çeşitli bağımlılıkları gösterir.
Yukarıdaki dosyalar için bağımlılık tablosu aşağıda verilmiştir.
Dolayısıyla, yukarıdaki bağımlılık çizelgesinde, kökte çalıştırılabilir 'ana' yi görebiliriz. Çalıştırılabilir 'ana', nesne dosyalarından oluşur. sırasıyla main.cpp, point.cpp ve square.cpp derlenerek oluşturulan main.o, point.o, square.o.
Tüm cpp uygulamaları, yukarıdaki grafikte gösterildiği gibi başlık dosyalarını kullanır. Yukarıda gösterildiği gibi main.cpp, sürücü programı olduğu ve nokta ve kare sınıflarını kullandığı için hem point.h hem de square.h'ye başvurur.
Sonraki dosya point.cpp referanslar point.h. Üçüncü dosya square.cpp, kare çizmek için bir noktaya ihtiyaç duyacağı için square.h ve point.h dosyalarına da başvurur.
Yukarıdaki bağımlılık grafiğinden, .cpp dosyası tarafından başvurulan herhangi bir .cpp dosyası veya .h dosyası her değiştiğinde, bu .o dosyasını yeniden oluşturmamız gerektiği açıktır. Örneğin, main.cpp değiştiğinde, main.o'yu yeniden oluşturmamız ve ana yürütülebilir dosyayı oluşturmak için nesne dosyalarını yeniden bağlamamız gerekir.
Projede az sayıda dosya varsa verdiğimiz yukarıdaki açıklamaların tümü sorunsuz çalışacaktır. Proje çok büyük olduğunda ve dosyalar büyük ve çok fazla olduğunda, dosyaları tekrar tekrar oluşturmak zorlaşır.
Bu nedenle, dosya oluşturmaya gidiyoruz ve projeyi oluşturmak ve yürütülebilir dosyayı oluşturmak için bir araç yapmak için kullanıyoruz.
Bir make dosyasının çeşitli kısımlarını zaten görmüştük. Dosyanın 'MAKEFILE' veya 'makefile' olarak adlandırılması ve kaynak klasöre yerleştirilmesi gerektiğini unutmayın.
Şimdi yukarıdaki örnek için makefile'ı yazacağız.
Derleyici ve derleyici bayraklarının değerlerini tutacak değişkenleri aşağıda gösterildiği gibi tanımlayacağız.
CC = g++ CFLAGS = -wall -g
Daha sonra makefile'mizde ilk hedefi, yani çalıştırılabilir main'i oluşturuyoruz. Yani bağımlılıkları olan bir hedef yazıyoruz.
ana: ana.o noktası.o kare.o
Bu nedenle, bu hedefi oluşturma komutu
$(CC) $(CFLAGS) –o main main.o point.o square.o
Not: Yukarıdaki komut aslında g ++ -wall –g –o main main.o point.o square.o 'ya çevrilir.
Bir sonraki hedefimiz ana.o, point.o, square.o nesne dosyalarını oluşturmak olacaktır.
Şimdi main.o'yu oluşturmak için hedef şu şekilde yazılacak:
Main.o: main.cpp point.h square.h
Bu hedef için komut şudur:
$(CC) $(CFLAGS) –c main.cpp
Sonraki dosya point.o aşağıdaki komut kullanılarak oluşturulabilir:
$(CC) $(CFLAGS) –c point.h
Yukarıdaki komutta point.cpp'yi atladık. Bunun nedeni, make'in .o dosyalarının .cpp dosyalarından oluşturulduğunu zaten bilmesidir, bu nedenle yalnızca .h (dahil etme dosyası) yeterlidir.
Benzer şekilde, square.o aşağıdaki komutla oluşturulabilir.
$(CC) $(CFLAGS) –c square.h point.h
Bu örnek için tüm makefile aşağıda gösterildiği gibi görünecektir:
# Makefile for Writing Make Files Example # ***************************************************** # Variables to control Makefile operation CC = g++ CFLAGS = -Wall -g # **************************************************** # Targets needed to bring the executable up to date main: main.o Point.o Square.o $(CC) $(CFLAGS) -o main main.o Point.o Square.o # The main.o target can be written more simply main.o: main.cpp Point.h Square.h $(CC) $(CFLAGS) -c main.cpp Point.o: Point.h Square.o: Square.h Point.h
Böylece, üç C ++ dosyasını derleyen ve ardından nesne dosyalarından çalıştırılabilir bir main oluşturan eksiksiz bir makefile'a sahip olduğumuzu görüyoruz.
Makefiles Avantajları
- Büyük projeler söz konusu olduğunda, makefiles kullanmak projeyi sistematik ve verimli bir şekilde temsil etmemize yardımcı olur.
- Makefiles, kaynak kodunu daha kısa ve okunması ve hata ayıklaması daha kolay hale getirir.
- Makefiles otomatik olarak yalnızca değiştirilen dosyaları derler. Bu nedenle, projenin bazı bölümleri değiştirildiğinde tüm projeyi yeniden oluşturmamız gerekmez.
- Make aracı, birden çok dosyayı aynı anda derlememize olanak tanır, böylece tüm dosyalar tek bir adımda derlenebilir.
Sonuç
Makefiles, yazılım geliştirme için bir nimettir. Bir C ++ makefile kullanarak daha kısa sürede çözüm üretebiliriz. Ayrıca, projenin bir bölümü değiştirildiğinde makefile, tüm projeyi yeniden oluşturmak zorunda kalmadan yalnızca o bölümü yeniden derler ve yeniden oluşturur.
C ++ Makefile, projeyi sistematik ve verimli bir şekilde temsil etmemize izin verir, böylece daha okunabilir ve hata ayıklaması daha kolay hale gelir.
Bu C ++ Makefile öğreticisinde makefile'ı gördük ve araçları ayrıntılı olarak yaptık. Sıfırdan bir makefile yazmayı da tartıştık.
=> Mükemmel C ++ Eğitim Kılavuzuna Buradan Bakabilirsiniz.
Önerilen Kaynaklar
- ÜCRETSİZ C ++ Programlamayı Öğrenmek İçin 70+ EN İYİ C ++ Öğreticisi
- Dev C ++ IDE: Kurulum, Özellikler ve C ++ Geliştirme
- C ++ 'ya Tam Bir Genel Bakış
- VBScript Dosya Nesneleri: CopyFile, DeleteFile, OpenTextFile, Read and Write Text File
- Python Dosya İşleme Eğitimi: Nasıl Oluşturulur, Açılır, Okunur, Yazılır
- Unix File System Komutları Touch, Cat, Cp, Mv, Rm, Mkdir (Bölüm B)
- 2021'de En İyi 12 Python IDE'si ve Kod Düzenleyicisi
- Mükemmel Kodlama Deneyimi için En İyi 15 En İyi Ücretsiz Kod Düzenleyicisi