Κατανόηση της σύνταξης του Makefile: Κοινά ζητήματα και λύσεις (συμπεριλαμβανομένου του 'Missing Operator' και 'Entry Point Not Found')

Katanoese Tes Syntaxes Tou Makefile Koina Zetemata Kai Lyseis Symperilambanomenou Tou Missing Operator Kai Entry Point Not Found



Ακριβώς όπως ένα αρχείο κώδικα περιέχει μία ή περισσότερες γραμμές κώδικα ως περιεχόμενο για να είναι αξιόλογο, το βασικό αρχείο make-file δημιουργείται χρησιμοποιώντας μεταβλητές, κανόνες και στόχους. Εκτός από αυτό, υπάρχουν και άλλοι παράγοντες που είναι απαραίτητοι για να δημιουργήσετε ένα πλήρες makefile χωρίς προβλήματα. Σε αυτόν τον οδηγό, θα συζητήσουμε τη βασική σύνταξη του makefile και τα κοινά προβλήματα κατά τη σύνταξη ενός makefile και θα παρέχουμε λύσεις για την επίλυση αυτών των προβλημάτων.

Κατανόηση της βασικής σύνταξης του Makefile

Για να ξεκινήσετε με τη δημιουργία ενός makefile, εξηγούμε τις βασικές ιδιότητες ενός makefile μέσω του παραδείγματος κώδικα makefile. Είναι απαραίτητο να συμπεριλάβετε τις ακόλουθες ιδιότητες σύνταξης στο περιεχόμενο του makefile για να λάβετε ένα εκτελέσιμο αρχείο:







Μεταβλητός s: Βασικά δεδομένα που αποθηκεύει αντικείμενα που είναι απαραίτητα για χρήση στο makefile. Αυτές οι μεταβλητές χρησιμοποιούνται για τον καθορισμό ενός μεταγλωττιστή, σημαιών, αρχείων προέλευσης, αρχείων αντικειμένων και αρχείων προορισμού. Μέσα στο ακόλουθο δείγμα makefile, υπάρχουν συνολικά πέντε μεταβλητές που είναι CXX (για να ορίσετε έναν μεταγλωττιστή C++), CXXFLAGSc (σημαίες μεταγλωττιστή), TARGET (για να ορίσετε ένα όνομα εκτελέσιμου αρχείου προορισμού), SRCS (για να ορίσετε ένα αρχείο πηγαίου κώδικα) , OBJS (για να περιέχει τα αρχεία αντικειμένων που δημιουργούνται μέσω του αρχείου πηγαίου κώδικα).



Στόχοι: Μια αναμενόμενη έξοδος που θα δημιουργηθεί από την πηγή. Μπορεί να είναι ένα αρχείο προορισμού ή οποιοδήποτε συμβολικό όνομα: το 'all' είναι ο προεπιλεγμένος στόχος που πρέπει να δημιουργηθεί μέσω της μεταβλητής 'TARGET', το '$TARGET' εξαρτάται από τις μεταβλητές 'OBJS' και ο 'καθαρός' στόχος αφαιρεί τον στόχο και αρχεία αντικειμένων από τον κατάλογο εργασίας.



Κανόνες και εντολές κατασκευής: Σύνολο βασικών οδηγιών που πρέπει να εκτελεστούν για τη δημιουργία ενός στόχου από το αρχείο προέλευσης ή τις εξαρτήσεις. Για παράδειγμα, ο κανόνας '%.o: %.cpp' εμφανίζει ότι το αρχείο με την επέκταση 'cpp' χρησιμοποιείται για τη δημιουργία ενός αρχείου αντικειμένου με την επέκταση 'o' ενώ και τα δύο αρχεία περιέχουν το ίδιο όνομα. Από την άλλη, η εντολή build $(CXX) $(CXXFLAGS) -o $(ΣΤΟΧΟΣ) $(OBJS) χρησιμοποιείται για τη σύνδεση ενός αρχείου αντικειμένου και ενός νέου αρχείου προορισμού. Με τον ίδιο τρόπο, η εντολή build $(CXX) $(CXXFLAGS) -c $< -o $@ μεταγλωττίζει το αρχείο προέλευσης σε αρχείο αντικειμένου.





Εξαρτήσεις: Οι εξαρτήσεις είναι πάντα εκεί όταν θέλετε να δημιουργήσετε ένα makefile. Για παράδειγμα, ο στόχος 'όλα' εξαρτάται από τη μεταβλητή 'TARGET' ενώ ο 'TARGET' εξαρτάται από τη μεταβλητή 'OBJS'. Ταυτόχρονα, η μεταβλητή «OBJS» εξαρτάται από το αρχείο προέλευσης μέσω της μεταβλητής «SRCS».

Σχόλια: Οι οδηγίες κατανοητές από τον άνθρωπο χρησιμοποιούνται συνήθως για να εξηγήσουν τον σκοπό της γραμμής κώδικα σε περίπτωση που χρησιμοποιείτε ένα αρχείο μετά από μεγάλο χρονικό διάστημα. Στο παρακάτω makefile, χρησιμοποιούμε τα σχόλια που ξεκινούν με το σύμβολο '#' για να εξηγήσουμε κάθε γραμμή.



CXX = g++
CXXFLAGS = -στδ =c++ έντεκα -Τείχος
ΣΤΟΧΟΣ = Νέος
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
όλα: $ ( ΣΤΟΧΟΣ )
$ ( ΣΤΟΧΟΣ ) : $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
$ ( CXX ) $ ( CXXFLAGS ) $ ( ΣΤΟΧΟΣ ) $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
% .Ο: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -ντο $ < $ @
ΚΑΘΑΡΗ:
rm -φά $ ( ΣΤΟΧΟΣ ) $ ( ΑΝΤΙΚΕΙΜΕΝΑ )

Κοινά Θέματα και Λύσεις

Κατά τη σύνταξη οποιουδήποτε makefile, είναι απαραίτητο να λάβετε υπόψη κάθε μικρή λεπτομέρεια για να έχετε το επιθυμητό αποτέλεσμα στο τέλος. Ορισμένα κοινά προβλήματα αντιμετωπίζονται συχνά από τους χρήστες κατά τη δημιουργία ενός αρχείου makefile. Σε αυτήν την ενότητα, θα συζητήσουμε αυτά τα ζητήματα και θα προτείνουμε τις πιθανές λύσεις ως εξής:

1: Χωρίς χρήση μεταβλητών

Η χρήση των μεταβλητών σε ένα makefile είναι απαραίτητη, καθώς απαιτείται για να ορίσετε τους μεταγλωττιστές, τον στόχο, τα αρχεία προέλευσης κ.λπ. Το πιο συνηθισμένο πρόβλημα που μπορεί να αντιμετωπίσετε είναι η μη χρήση μεταβλητής σε ένα makefile. Επομένως, βεβαιωθείτε ότι χρησιμοποιείτε τις βασικές μεταβλητές όπως CXX, CXXFLAGSc (σημαίες μεταγλωττιστή), TARGET, SRCS και OBJS στο προηγούμενο δείγμα makefile.

2: Λείπει ζήτημα διαχωριστικού

Κατά τη σύνταξη ενός makefile, είναι απαραίτητο να λαμβάνετε υπόψη τους κανόνες εσοχής πολύ προσεκτικά, επειδή η χρήση διαστημάτων αντί για καρτέλες θα σας οδηγήσει σε ένα πρόβλημα 'χωριστικού που λείπει' κατά την εκτέλεση της εντολής 'make'. Για παράδειγμα, προσθέτουμε το διάστημα στην αρχή ενός κανόνα στη γραμμή 13 και αφαιρούμε την καρτέλα.

$ ( ΣΤΟΧΟΣ ) : $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
$ ( CXX ) $ ( CXXFLAGS ) $ ( ΣΤΟΧΟΣ ) $ ( ΑΝΤΙΚΕΙΜΕΝΑ )

Κατά την εκτέλεση του ερωτήματος 'make', λαμβάνουμε ένα σφάλμα 'missing separator' στη γραμμή 13 και το αρχείο σταματά να εκτελείται. Για να αποφύγετε αυτό το ζήτημα, βεβαιωθείτε ότι χρησιμοποιείτε 'tab' αντί για κενά.

φτιαχνω, κανω

Για να αποφύγετε αυτό το ζήτημα, βεβαιωθείτε ότι χρησιμοποιείτε το 'tab' αντί για τα κενά όπως απεικονίζονται στην παρακάτω εικόνα:

$ ( ΣΤΟΧΟΣ ) : $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
$ ( CXX ) $ ( CXXFLAGS ) $ ( ΣΤΟΧΟΣ ) $ ( ΑΝΤΙΚΕΙΜΕΝΑ )

3: Τεύχος «Το σημείο εισόδου δεν βρέθηκε».

Αυτό το σφάλμα εμφανίζεται κυρίως λόγω του αρχείου προέλευσης και όχι λόγω του makefile, όπως όταν χάνετε τη χρήση της συνάρτησης 'main()' στο αρχείο πηγαίου κώδικα. Για παράδειγμα, αντικαθιστούμε τον ορισμό της συνάρτησης main() με μια απλή δήλωση συνάρτησης που ορίζεται από το χρήστη.

#include
int show ( ) {
char v;
std::cout << 'Εισαγάγετε μια τιμή:' ;
std::cin >> σε;
std::cout << σε << std::endl;
ΕΠΙΣΤΡΟΦΗ 0 ;
}

Κατά την εκτέλεση της εντολής «make» στη γραμμή εντολών των Windows, συναντάμε την «απροσδιόριστη αναφορά στο «WinMain»». Αυτό συμβαίνει επειδή ο μεταγλωττιστής δεν βρίσκει κανένα σημείο εισόδου για να ξεκινήσει να εκτελεί το αρχείο C++. Για να το επιλύσετε αυτό, αντικαταστήστε το 'show' με το 'main'.

4: Χρήση λανθασμένων επεκτάσεων

Μερικές φορές, ένας χρήστης μπορεί να χρησιμοποιήσει ακούσια τις λάθος επεκτάσεις για ένα αρχείο προέλευσης που θα χρησιμοποιηθεί στο makefile. Η χρήση λανθασμένης επέκτασης θα οδηγήσει σε σφάλματα χρόνου εκτέλεσης, δηλαδή δεν υπάρχει κανόνας για τη δημιουργία στόχου. Δημιουργούμε ένα makefile για να δημιουργήσουμε το εκτελέσιμο αρχείο και το αρχείο αντικειμένου για το αρχείο C++. Στην έβδομη γραμμή, παρέχουμε το αρχείο προέλευσης με την επέκταση 'c'.

CXX := g++
CXXFLAGS := -στδ =c++ έντεκα -Τείχος
ΣΤΟΧΟΣ = νέος
SRCS = κύρια.γ
OBJS = $ ( SRCS:.cpp=.o )
Όλα: $ ( ΣΤΟΧΟΣ )
$ ( ΣΤΟΧΟΣ ) : $ ( ΑΝΤΙΚΕΙΜΕΝΑ )

Η εκτέλεση της εντολής 'make' μας οδηγεί στο σφάλμα 'No rule to make target 'main.c''. Για να αποφύγετε αυτό το ζήτημα, βεβαιωθείτε ότι χρησιμοποιείτε τη σωστή επέκταση αρχείου προέλευσης.

φτιαχνω, κανω

5: Εξαρτήσεις που λείπουν

Κατά τη σύνταξη ενός makefile, θα πρέπει να συμπεριλάβετε όλες τις εξαρτήσεις για ένα αρχείο προέλευσης για να λάβετε την επιθυμητή έξοδο. Για παράδειγμα, το αρχείο κώδικα C++ χρησιμοποιεί το αρχείο 'myheader.h' ως εξάρτησή του. Επομένως, το αναφέρουμε στο αρχείο κώδικα C++ ως εξής:

#include
#include 'myheader.h'
int show ( ) {
char v;
std::cout << 'Εισαγάγετε μια τιμή:' ;
std::cin >> σε;
std::cout << σε << std::endl;
ΕΠΙΣΤΡΟΦΗ 0 ;
}

Μέσα στο makefile, αγνοούμε σκόπιμα τη χρήση του αρχείου 'myheader.h' στον κανόνα κατασκευής που είναι γραμμένος στη γραμμή 9.

% .Ο: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -ντο $ < $ @

Τώρα, ενώ χρησιμοποιούμε την εντολή 'make', συναντάμε το σφάλμα 'Nothing to be done for 'all'.

φτιαχνω, κανω

% .Ο: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGS ) -ντο $ < $ @

Για να αποφύγετε το εν λόγω ζήτημα και να εκτελέσετε με επιτυχία τον πηγαίο κώδικα, αναφέρετε το όνομα αρχείου 'myheader.h' στην ένατη γραμμή του αρχείου makefile, όπως απεικονίζεται παρακάτω:

συμπέρασμα

Σε αυτόν τον οδηγό, εξηγήσαμε διεξοδικά τη σύνταξη του makefile χρησιμοποιώντας τα απαραίτητα περιεχόμενά του, όπως μεταβλητές, εντολές κατασκευής, κανόνες κ.λπ. Το παράδειγμα κώδικα περιλαμβάνεται για να επεξεργαστεί τη σύνταξη με μεγαλύτερη σαφήνεια. Στο τέλος, συζητήσαμε ορισμένα κανονικά ζητήματα και τις λύσεις τους που μπορεί να συναντήσει ένας χρήστης κατά τη δημιουργία ενός makefile.