Γιατί η εντολή openssl λειτουργεί αλλά η κατασκευή του VPN αποτυγχάνει
Ένα openssl που λειτουργεί δεν λέει τίποτα για τις κεφαλίδες και τις βιβλιοθήκες σύνδεσης. Ελέγξτε το πακέτο ανάπτυξης, την αρχιτεκτονική προορισμού και το αρχείο καταγραφής εντοπισμού της κατασκευής.
Το τερματικό αναφέρει πρόθυμα μια έκδοση OpenSSL, και το δέντρο πηγαίου κώδικα εξακολουθεί να αποτυγχάνει με μήνυμα για κεφαλίδες κρυπτογράφησης που λείπουν. Και οι δύο δηλώσεις ισχύουν ταυτόχρονα, επειδή το εργαλείο χρόνου εκτέλεσης και ένα σύνολο εισόδων κατασκευής παραδίδονται χωριστά. Εκτελέστε αυτούς τους τέσσερις ελέγχους με σειρά: εγκατεστημένα πακέτα, έξοδος εντοπισμού, διαδρομές αναζήτησης και, τέλος, αν ο ίδιος ο πηγαίος κώδικας είναι συμβατός. Σταματήστε στον πρώτο έλεγχο που εξηγεί την αποτυχία, αντί να επικολλήσετε μια παλιά λίστα εξαρτήσεων.
Ο χρόνος εκτέλεσης και οι είσοδοι κατασκευής είναι διαφορετικά πακέτα
Μια διανομή χωρίζει το OpenSSL σε ένα πακέτο χρόνου εκτέλεσης που παρέχει την κοινή βιβλιοθήκη και το εργαλείο γραμμής εντολών, και σε ένα πακέτο ανάπτυξης που παρέχει κεφαλίδες, ονόματα σύνδεσης χωρίς έκδοση και μεταδεδομένα pkg-config. Η εγκατάσταση του πρώτου δεν εγκαθιστά το δεύτερο, και ο μεταγλωττιστής χρειάζεται μόνο το δεύτερο.
Ελέγξτε τι υπάρχει πραγματικά και όχι τι θυμάστε ότι εγκαταστήσατε. Σε συστήματα που βασίζονται στο Debian το πακέτο ανάπτυξης είναι συνήθως libssl-dev, ενώ ο χρόνος εκτέλεσης είναι ένα πακέτο βιβλιοθήκης με έκδοση συν το δυαδικό openssl.
dpkg -l | grep -E 'libssl-dev|libssl3|openssl' pkg-config --modversion openssl openssl version
Η πρώτη εντολή δείχνει ποιο από τα τρία είναι εγκατεστημένο, η δεύτερη αναφέρει την έκδοση που θα εντοπίσει το σύστημα κατασκευής μέσω pkg-config, και η τρίτη αναφέρει την έκδοση χρόνου εκτέλεσης. Μια γραμμή που λείπει στην πρώτη έξοδο εξηγεί το σφάλμα αμέσως. Μια ασυμφωνία έκδοσης μεταξύ της δεύτερης και της τρίτης είναι άλλο πρόβλημα και συνήθως σημαίνει ότι δύο εγκαταστάσεις συναγωνίζονται.
Διαβάστε την ίδια την έξοδο εντοπισμού της κατασκευής
Οι περισσότερες αποτυχίες φαίνονται στο αρχείο καταγραφής ρύθμισης αν το διαβάσετε πριν από τη σύνοψη. Η μονάδα FindOpenSSL του CMake αναφέρει ποιον κατάλογο include και ποιες βιβλιοθήκες βρήκε, και αποτυγχάνει με συγκεκριμένο μήνυμα όταν λείπει ένα απαιτούμενο συστατικό.
Επιβεβαιώστε ποια έκδοση μονάδας χρησιμοποιεί το έργο, γιατί ένα αντίγραφο που περιλαμβάνεται μέσα στο δέντρο πηγαίου κώδικα μπορεί να συμπεριφέρεται διαφορετικά από αυτό που συνοδεύει το εγκατεστημένο CMake. Έπειτα διαβάστε τη λίστα συστατικών: ένα έργο που ζητά μόνο Crypto δεν χρειάζεται τη βιβλιοθήκη SSL, και ένα που ζητά SSL θα αποτύχει αν υπάρχει μόνο μέρος του πακέτου ανάπτυξης.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release grep -i -E 'openssl|ssl' build/CMakeCache.txt
Η πρώτη εντολή ρυθμίζει από την αρχή, και η δεύτερη δείχνει τα αποθηκευμένα αποτελέσματα, μαζί με οποιονδήποτε ριζικό κατάλογο ή διαδρομή βιβλιοθήκης όπου κατέληξε η μονάδα. Αν η προσωρινή μνήμη δείχνει σε παλιό πρόθεμα από προηγούμενη προσπάθεια, διαγράψτε τον κατάλογο κατασκευής και ρυθμίστε ξανά αντί να επεξεργάζεστε τιμές με το χέρι. Οι παρωχημένες καταχωρίσεις προσωρινής μνήμης είναι συχνή αιτία αποτυχίας που επιβιώνει από μια σωστή διόρθωση.
Στρέψτε την κατασκευή στη σωστή εγκατάσταση, στενά
Όταν ένα εγκεκριμένο OpenSSL βρίσκεται έξω από την προεπιλεγμένη διαδρομή αναζήτησης, το FindOpenSSL τεκμηριώνει το OPENSSL_ROOT_DIR ως υπόδειξη για αυτήν τη συγκεκριμένη κατασκευή. Σε συστήματα τύπου Unix συμβουλεύεται επίσης το pkg-config, οπότε ένα κατάλληλο PKG_CONFIG_PATH μπορεί να βοηθήσει χωρίς να αλλάξει τίποτα συνολικά.
cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release ldd build/vpn_client | grep -i ssl
Η πρώτη εντολή περιορίζει την υπόδειξη σε έναν κατάλογο κατασκευής, και η δεύτερη δείχνει ποια κοινή βιβλιοθήκη θα φορτώσει το παραγόμενο δυαδικό κατά τον χρόνο εκτέλεσης. Μια κατασκευή που συνδέεται με το επιδιωκόμενο πρόθεμα και ένα δυαδικό που φορτώνει άλλο αποτελούν πρόβλημα διαδρομής χρόνου εκτέλεσης, όχι πρόβλημα εντοπισμού, και απαιτούν απόφαση για rpath ή ρύθμιση φορτωτή αντί για άλλη σημαία ρύθμισης.
Κρατήστε αυτές τις επιλογές τοπικές στην κατασκευή. Η αντικατάσταση βιβλιοθηκών συστήματος ή η επεξεργασία καθολικών αρχείων pkg-config για να ικανοποιηθεί ένα έργο είναι ο τρόπος με τον οποίο μια λειτουργική επιφάνεια εργασίας γίνεται χαλασμένη. Ένας κατάλογος κατασκευής που καταγράφει το πρόθεμα είναι αναπαραγώγιμος· μια αλλαγή σε όλο το μηχάνημα είναι περιστατικό υποστήριξης που περιμένει το επόμενο έργο. Διαγράψτε τον κατάλογο κατασκευής όταν αλλάζετε την υπόδειξη, ώστε η προσωρινή μνήμη να μην μπορεί να κρατήσει την παλιά απάντηση.
Μάθετε πότε το πρόβλημα είναι ο πηγαίος κώδικας
Ένα επιτυχημένο βήμα ρύθμισης αποδεικνύει μόνο ότι ολοκληρώθηκαν οι έλεγχοι. Η μεταγλώττιση μπορεί ακόμη να απορρίψει ένα API που ο πηγαίος κώδικας περιμένει, και η σύνδεση μπορεί ακόμη να αποτύχει σε σύμβολο που λείπει. Κρατήστε το πρώτο συγκεκριμένο σφάλμα από κάθε στάδιο, γιατί τα επόμενα είναι συνήθως συνέπειες.
Το OpenSSL 3 χαρακτήρισε παρωχημένες και αφαίρεσε αρκετές διεπαφές που οι παλαιότεροι πελάτες VPN χρησιμοποιούν άμεσα, οπότε ένα δέντρο πηγαίου κώδικα από εκείνη την εποχή μπορεί να χρειάζεται πραγματικές αλλαγές αντί για νέα διαδρομή include. Αν οι συντηρητές υποστηρίζουν τρέχουσα έκδοση, χρησιμοποιήστε την. Αν όχι, η απόφαση ανήκει σε όποιον κατέχει την υπηρεσία, όχι σε αναζήτηση παλαιότερου ονόματος αρχείου βιβλιοθήκης.
Τα προαιρετικά συστατικά επιφάνειας εργασίας έχουν επίσης τις απαιτήσεις τους. Ένας στόχος γραμμής εντολών που ρυθμίζεται καθαρά δεν λέει τίποτα για το αν θα κατασκευαστούν το κιτ εργαλείων GUI και ο επεξεργαστής, οπότε αντιμετωπίστε μια παλιά λίστα πακέτων Qt ως ιστορία και όχι ως προδιαγραφή. Ελέγξτε τις ίδιες τις επιλογές της αναθεώρησης του πηγαίου κώδικα για το ποιες διεπαφές είναι ενεργοποιημένες εξ ορισμού. Έπειτα κατασκευάστε μόνο ό,τι χρειάζεστε, γιατί κάθε προαιρετική εξάρτηση είναι άλλο ένα πρόβλημα εντοπισμού που περιμένει να συμβεί.