c makefile tutorial
Σε αυτό το σεμινάριο C ++ Makefile, θα συζητήσουμε τις κύριες πτυχές του εργαλείου και του makefile, συμπεριλαμβανομένων των πλεονεκτημάτων και των εφαρμογών του στο C ++:
Σε οποιοδήποτε έργο C ++, ένας από τους σημαντικούς στόχους είναι η απλοποίηση της δημιουργίας του έργου, ώστε να έχουμε όλες τις εξαρτήσεις και τα αρχεία έργου σε ένα μέρος και να τα εκτελούμε με μία κίνηση, ώστε να έχουμε την επιθυμητή έξοδο με μία μόνο εντολή.
ηλεκτρονικό εργαλείο χάραξης κωδικού πρόσβασης email
Ταυτόχρονα, όποτε τροποποιείται κάποιο από τα αρχεία του έργου, δεν χρειάζεται να αντιμετωπίσουμε ξανά το πρόβλημα της δημιουργίας ολόκληρου του έργου, δηλαδή κάθε φορά που ένα ή δύο αρχεία τροποποιούνται στο έργο, ανακατασκευάζουμε μόνο αυτά τα αλλαγμένα αρχεία και μετά συνεχίζουμε με την εκτέλεση.
=> Διαβάστε το The Easy C ++ Training Series.
Αυτά είναι ακριβώς τα χαρακτηριστικά που αντιμετωπίζονται από το εργαλείο 'make' και 'makefiles' στο C ++. Σε αυτό το σεμινάριο, θα συζητήσουμε όλες τις σημαντικές πτυχές του makefiles καθώς και τις εφαρμογές τους στο C ++.
Τι θα μάθετε:
Δημιουργία εργαλείου
Το Make είναι ένα εργαλείο UNIX και χρησιμοποιείται ως εργαλείο για την απλοποίηση του κτιρίου που μπορεί να εκτελεστεί από διαφορετικές ενότητες ενός έργου. Υπάρχουν διάφοροι κανόνες που καθορίζονται ως καταχωρίσεις στόχου στο makefile. Το εργαλείο κατασκευής διαβάζει όλους αυτούς τους κανόνες και συμπεριφέρεται ανάλογα.
Για παράδειγμα, Εάν ένας κανόνας καθορίζει οποιαδήποτε εξάρτηση, τότε το εργαλείο δημιουργίας θα περιλαμβάνει αυτήν την εξάρτηση για σκοπούς σύνταξης. Η εντολή make χρησιμοποιείται στο makefile για τη δημιουργία ενοτήτων ή για την εκκαθάριση των αρχείων.
Η γενική σύνταξη του make είναι:
%make target_label #target_label is a specific target in makefile
Για παράδειγμα , εάν θέλουμε να εκτελέσουμε εντολές rm για να καθαρίσουμε αρχεία, γράφουμε:
% make clean #here clean είναι μια ετικέτα target_ καθορισμένη για εντολές rm
C ++ Makefile
Το makefile δεν είναι τίποτα άλλο από ένα αρχείο κειμένου που χρησιμοποιείται ή αναφέρεται από την εντολή «make» για τη δημιουργία των στόχων. Το makefile περιέχει επίσης πληροφορίες όπως εξαρτήσεις σε επίπεδο πηγής για κάθε αρχείο καθώς και τις εξαρτήσεις build-order.
Τώρα ας δούμε τη γενική δομή του makefile.
Ένα makefile συνήθως ξεκινά με μεταβλητές δηλώσεις ακολουθούμενες από ένα σύνολο καταχωρίσεων στόχων για τη δημιουργία συγκεκριμένων στόχων. Αυτοί οι στόχοι μπορεί να είναι .o ή άλλα εκτελέσιμα αρχεία σε αρχεία C ή C ++ και .class στην Java.
Μπορούμε επίσης να έχουμε ένα σύνολο καταχωρίσεων στόχων για την εκτέλεση ενός συνόλου εντολών που καθορίζονται από την ετικέτα στόχου.
Έτσι, ένα γενικό makefile είναι όπως φαίνεται παρακάτω:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Ένα απλό παράδειγμα του makefile φαίνεται παρακάτω.
# 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
Στο παραπάνω makefile, έχουμε καθορίσει δύο ετικέτες στόχους, πρώτον είναι η ετικέτα «όλα» για δημιουργία εκτελέσιμου από αρχεία αντικειμένων myprogram και mylib. Η δεύτερη ετικέτα στόχος 'clean' αφαιρεί όλα τα αρχεία με το όνομα 'myprogram'.
Ας δούμε μια άλλη παραλλαγή του makefile.
# 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)
Όπως φαίνεται στο παραπάνω παράδειγμα, σε αυτό το makefile χρησιμοποιούμε τη μεταβλητή «CC» που περιέχει την τιμή μεταγλωττιστή που χρησιμοποιούμε (GCC σε αυτήν την περίπτωση). Μια άλλη μεταβλητή 'CFLAGS' περιέχει τις σημαίες του μεταγλωττιστή που θα χρησιμοποιήσουμε.
Η τρίτη μεταβλητή «TARGET» περιέχει το όνομα του προγράμματος για το οποίο πρέπει να δημιουργήσουμε το εκτελέσιμο.
Το πλεονέκτημα μέτρου αυτής της παραλλαγής του makefile είναι ότι πρέπει απλώς να αλλάξουμε τις τιμές των μεταβλητών που έχουμε χρησιμοποιήσει όποτε υπάρχει κάποια αλλαγή στο μεταγλωττιστή, στις σημαίες του μεταγλωττιστή ή στο όνομα του εκτελέσιμου προγράμματος.
Παράδειγμα Make and Makefile
Εξετάστε ένα παράδειγμα προγράμματος με τα ακόλουθα αρχεία:
- Main.cpp: Κύριο πρόγραμμα οδήγησης
- Point.h: Αρχείο κεφαλίδας για κλάση σημείου
- Point.cpp: Αρχείο υλοποίησης CPP για κλάση σημείου
- Square.h: Αρχείο κεφαλίδας για τετράγωνη κλάση
- Square.cpp; Αρχείο υλοποίησης CPP για τετράγωνη κλάση
Με τα παραπάνω αρχεία .cpp και .h, πρέπει να μεταγλωττίσουμε αυτά τα αρχεία ξεχωριστά για να δημιουργήσουμε αρχεία .o και στη συνέχεια να τα συνδέσουμε σε εκτελέσιμο όνομα με όνομα.
Στη συνέχεια, καταρτίζουμε αυτά τα αρχεία ξεχωριστά.
- g ++ -c main.cpp: δημιουργεί main.o
- g ++ -c point.cpp: δημιουργεί ένα point.o
- g ++ -c square.cpp: παράγει square.o
Στη συνέχεια, συνδέουμε τα αρχεία αντικειμένων μαζί για να δημιουργήσουμε το εκτελέσιμο κύριο.
g ++ -o main main.o point.o square.o
Στη συνέχεια, πρέπει να αποφασίσουμε ποια από τα αρχεία θα πρέπει να μεταγλωττίσουμε και να αναδημιουργήσουμε όταν ενημερώνονται ορισμένα τμήματα του προγράμματος. Για αυτό, θα έχουμε ένα γράφημα εξάρτησης που δείχνει διάφορες εξαρτήσεις για καθένα από τα αρχεία υλοποίησης.
Δίνεται παρακάτω το γράφημα εξάρτησης για τα παραπάνω αρχεία.
Έτσι, στο παραπάνω γράφημα εξάρτησης, μπορούμε να δούμε το εκτελέσιμο 'main' στη ρίζα. Το εκτελέσιμο 'main' αποτελείται από αρχεία αντικειμένων, δηλαδή. main.o, point.o, square.o που δημιουργείται με τη σύνθεση των main.cpp, point.cpp και square.cpp αντίστοιχα.
Όλες οι εφαρμογές cpp χρησιμοποιούν αρχεία κεφαλίδας όπως φαίνεται στο παραπάνω γράφημα. Όπως φαίνεται παραπάνω, το main.cpp αναφέρει τόσο το point.h όσο και το square.h καθώς είναι το πρόγραμμα οδήγησης και χρησιμοποιεί τάξεις σημείου και τετραγώνου.
Το επόμενο αρχείο point.cpp αναφέρει point.h. Το τρίτο αρχείο square.cpp αναφέρει το square.h καθώς και το point.h καθώς θα χρειαστεί επίσης ένα σημείο για να σχεδιάσει το τετράγωνο.
Από το παραπάνω γράφημα εξάρτησης, είναι σαφές ότι όποτε αλλάζει κάποιο αρχείο .cpp ή αρχείο .h που αναφέρεται από το αρχείο .cpp, πρέπει να δημιουργήσουμε ξανά αυτό το αρχείο .o. Για παράδειγμα, όταν αλλάζει το main.cpp, πρέπει να αναδημιουργήσουμε το main.o και να συνδέσουμε ξανά τα αρχεία αντικειμένων για να δημιουργήσουμε το κύριο εκτελέσιμο.
Όλες οι παραπάνω εξηγήσεις που έχουμε δώσει θα λειτουργούν ομαλά αν υπάρχουν λίγα αρχεία στο έργο. Όταν το έργο είναι τεράστιο και τα αρχεία είναι μεγάλα και πάρα πολλά, τότε καθίσταται δύσκολη η επαναδημιουργία των αρχείων επανειλημμένα.
Έτσι, πηγαίνουμε για δημιουργία αρχείων και χρησιμοποιούμε για να φτιάξουμε ένα εργαλείο για την κατασκευή του έργου και τη δημιουργία του εκτελέσιμου.
Έχουμε ήδη δει διάφορα μέρη ενός αρχείου make. Σημειώστε ότι το αρχείο θα πρέπει να ονομάζεται 'MAKEFILE' ή 'makefile' και θα πρέπει να τοποθετείται στον φάκελο προέλευσης.
Τώρα θα γράψουμε το makefile για το παραπάνω παράδειγμα.
Θα ορίσουμε μεταβλητές για να διατηρήσουμε τις τιμές των μεταγλωττιστών και των σημαιών μεταγλωττιστή όπως φαίνεται παρακάτω.
CC = g++ CFLAGS = -wall -g
Στη συνέχεια, δημιουργούμε τον πρώτο στόχο στο makefile μας, δηλαδή στο εκτελέσιμο κύριο. Γι 'αυτό γράφουμε έναν στόχο με τις εξαρτήσεις του.
main: main.o point.o square.o
Έτσι, η εντολή για τη δημιουργία αυτού του στόχου είναι
$(CC) $(CFLAGS) –o main main.o point.o square.o
Σημείωση: Η παραπάνω εντολή μεταφράζεται πραγματικά σε g ++ -wall –g –o main main.o point.o square.o
Ο επόμενος στόχος μας θα είναι η δημιουργία αρχείων αντικειμένων, main.o, point.o, square.o
Τώρα για τη δημιουργία main.o, ο στόχος θα γραφτεί ως:
Main.o: main.cpp point.h square.h
Η εντολή για αυτόν τον στόχο είναι:
$(CC) $(CFLAGS) –c main.cpp
Το επόμενο αρχείο point.o μπορεί να δημιουργηθεί χρησιμοποιώντας την παρακάτω εντολή:
$(CC) $(CFLAGS) –c point.h
Στην παραπάνω εντολή, παραλείψαμε το point.cpp. Αυτό συμβαίνει επειδή το make ήδη γνωρίζει ότι τα αρχεία .o δημιουργούνται από τα αρχεία .cpp, επομένως μόνο το .h (include file) είναι αρκετό.
Ομοίως, το square.o μπορεί να δημιουργηθεί με την ακόλουθη εντολή.
$(CC) $(CFLAGS) –c square.h point.h
Ολόκληρο το makefile για αυτό το παράδειγμα θα φαίνεται όπως φαίνεται παρακάτω:
# 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
Έτσι, βλέπουμε ότι έχουμε ένα πλήρες αρχείο makefile που συγκεντρώνει τρία αρχεία C ++ και στη συνέχεια δημιουργεί ένα εκτελέσιμο κύριο από τα αρχεία αντικειμένων.
Πλεονεκτήματα του Makefiles
- Όταν πρόκειται για μεγάλα έργα, η χρήση του makefiles μας βοηθά να εκπροσωπούμε το έργο με συστηματικό και αποτελεσματικό τρόπο.
- Τα Makefiles κάνουν τον πηγαίο κώδικα πιο περιεκτικό και εύκολο στην ανάγνωση και εντοπισμό σφαλμάτων.
- Το Makefiles μεταγλωττίζει αυτόματα μόνο τα αρχεία που έχουν αλλάξει. Επομένως, δεν χρειάζεται να αναδημιουργήσουμε ολόκληρο το έργο όταν τροποποιηθούν ορισμένα από τα τμήματα του έργου.
- Το εργαλείο δημιουργίας επιτρέπει τη συλλογή πολλών αρχείων ταυτόχρονα, ώστε όλα τα αρχεία να μπορούν να συγκεντρωθούν σε ένα βήμα.
συμπέρασμα
Το Makefiles είναι ένα όφελος για την ανάπτυξη λογισμικού. Χρησιμοποιώντας ένα C ++ makefile, μπορούμε να δημιουργήσουμε λύσεις σε λιγότερο χρόνο. Επίσης, όταν ένα μέρος του έργου τροποποιηθεί, το makefile αναδιαμορφώνει και αναδημιουργεί μόνο αυτό το μέρος χωρίς να χρειάζεται να αναδημιουργήσει ολόκληρο το έργο.
Το C ++ Makefile μας επιτρέπει να αντιπροσωπεύουμε το έργο συστηματικά και αποτελεσματικά, καθιστώντας το πιο ευανάγνωστο και εύκολο στην αποσφαλμάτωση.
Σε αυτό το σεμινάριο C ++ Makefile, έχουμε δει λεπτομερώς το makefile και φτιάχνουμε εργαλεία. Έχουμε επίσης συζητήσει πώς να γράφετε ένα makefile από το μηδέν.
=> Ανατρέξτε στον τέλειο οδηγό εκπαίδευσης C ++ εδώ.
Συνιστώμενη ανάγνωση
- 70+ ΚΑΛΥΤΕΡΑ C ++ Tutorials για να μάθετε C ++ Προγραμματισμό ΔΩΡΕΑΝ
- Dev C ++ IDE: Εγκατάσταση, δυνατότητες και ανάπτυξη C ++
- Μια πλήρης επισκόπηση του C ++
- Αντικείμενα αρχείου VBScript: CopyFile, DeleteFile, OpenTextFile, Ανάγνωση και εγγραφή αρχείου κειμένου
- Εκμάθηση χειρισμού αρχείων Python: Πώς να δημιουργήσετε, να ανοίξετε, να διαβάσετε, να γράψετε
- Unix Σύστημα αρχείων εντολών Touch, Cat, Cp, Mv, Rm, Mkdir (Μέρος B)
- 12 καλύτεροι Python IDE και Code Editors το 2021
- Κορυφαίοι 15 καλύτεροι δωρεάν επεξεργαστές κώδικα για τέλεια εμπειρία κωδικοποίησης