Title: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 16, 2012, 14:48:00 pm Φτιάχνω ένα πρόγραμμα και κάνω include διάφορες βιβλιοθήκες που έχω εγκατεστημένες στο σύστημά μου.
Το κάνω compile και παράγεται το εκτελέσιμο. Προσπαθώ να το τρέξω σε διαφορετικό υπολογιστή που λείπουν αυτές οι βιβλιοθήκες και βγάζει προφανώς σφάλμα. Πώς μπορώ λοιπόν να ενσωματώσω αντί να συνδέσω τις απαραίτητες βιβλιοθήκες; Μιλάμε πάντα για Linux. :) Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: SolidSNK on August 16, 2012, 15:11:39 pm Χρειάζεσαι static linking. Δες το -static option στον gcc. Βέβαια υπάρχει μεγάλη πιθανότητα να έχεις ένα τεράστιο εκτελέσιμο, έτσι δε συνηθίζεται.
Title: deleted Post by: BOBoMASTORAS on August 16, 2012, 15:13:39 pm deleted
Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 22, 2012, 12:42:33 pm Ευχαριστώ για τις απαντήσεις.
Τώρα ένα καινούριο "πρόβλημα" Δημιούργησα 1 πρόγραμμα με διάφορες κλάσεις χωρίς headers του τύπου class1.cpp class2.cpp main.cpp όπου η main έχει include ta *cpp και το κάνω compile me g++ -g0 -O3 στη συνέχεια τον ίδιο κώδικα τον περνάω στο Eclipse και τον κάνω πιο σωστά δομημένο με headers δλδ class1.h class1.cpp class2.h class2.cpp main.cpp όπου η main έχει include τα *h και το κάνω compile δημιουργώντας cmake. (η εντολή compiler είναι g++ -g0 -O3 -c) Ποιο είναι το πρόβλημα; Το πρόγραμμα στη 2η περίπτωση είναι 1 τάξη μεγέθους πιο αργό έχει να κάνει κάτι με το cmake? το makefile το παράγει αυτόματα το Eclipse Title: deleted Post by: BOBoMASTORAS on August 22, 2012, 13:33:28 pm deleted
Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 22, 2012, 13:49:46 pm οχι, το execution time εννοώ
EDIT: επίσης, η διαφορά δεν είναι μόνο Quote Λογικά το ότι έχεις σπάσει τον κώδικα σε h/cpp αλλά ο compiler τρέχει και με το extra argument "-c" (η εντολή compiler είναι g++ -g0 -O3 -c) Title: deleted Post by: BOBoMASTORAS on August 22, 2012, 17:11:20 pm deleted
Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 22, 2012, 17:26:53 pm το -c δεν έχει κάποια επίδραση Μάλλον έχετε κάποια αλγοριθμική αλλαγή η οποία αλλάζει τον χρόνο εκτέλεσης. τι εννοείς αλγοριθμική αλλαγή; Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: Issle on August 22, 2012, 23:06:15 pm Όταν χωρίζεις τον κώδικά σου σε headers και implementations ( cpp ) είναι πιθανόν ο compiler να μην μπορεί να κάνει συγκεκριμένα optimizations. Κυρίως γιατί όταν χτίζει ένα class ( cpp ) που αναφέρεται μέσω header σε ένα άλλο class, δεν γνωρίζει τον κώδικα του άλλου class τη στιγμή που κάνει compiling ( γιατί τα χτίζει ανεξάρτητα και τα κάνει linking μετά ).
Με μια μικρή επιφύλαξη. PS: Εδώ φαίνεται η ανωτερότητα της java μπροστά στην C/C++. Hotspot, JIT, AOT compiler ;) Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: BOBoMASTORAS on August 22, 2012, 23:38:48 pm το -c δεν έχει κάποια επίδραση Μάλλον έχετε κάποια αλγοριθμική αλλαγή η οποία αλλάζει τον χρόνο εκτέλεσης. τι εννοείς αλγοριθμική αλλαγή; με λίγα λόγια αλλάξατε κάτι στον κώδικα. κάνε compile / link με -pg -O0 -g3 CXXFLAGS=-pg -O0 -g3 LDFLAGS=-pg Στη συνέχεια μπες στο φάκελο που είναι το εκτελέσιμο και τρέξ το πχ ./executable (θα τρέχει πολύ πιο αργά, μειώστε τον όγκο των δεδομένων / επαναλήψεων) Θα δημιουργηθεί μετά το τέλος της εκτέλεσης ένα αρχείο gmon.out Τρέξε από κονσόλα gprof executable θα εμφανιστούν τα στατιστικά του χρόνου εκτέλεσης ανά συνάρτηση. Στην αρχή θα υπάρχει υπόμνημα για το τι είναι τι. Αν σας την σπάει το υπόμνημα τρέχετε gprof -b executable Δείτε ποια συνάρτηση σας καθυστερεί και καν τε optimizations Συνήθως ισχύει ο κανόνας 10/90. Δλδ το 10% του κώδικα τρέχει το 90% του χρόνου. Κάν' τε optimizations μόνο εκεί και επαναλάβετε. PS: Εδώ φαίνεται η ανωτερότητα της java μπροστά στην C/C++. Hotspot, JIT, AOT compiler ;) άμα κάποιος είναι άμπαλος έτσι είναι. Αν όμως γνωρίζει με τη java νοιώθει ανάπηρος. Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 23, 2012, 11:14:32 am to gprof το έχουμε κάνει ήδη.
Ξεκινήσαμε αρχικά με απλό text editor kai terminal g++ κάναμε gprof και είδαμε τι παίζει και ίσχυε ακριβώς αυτό το 90-10. Το βελτιώσαμε, έτρεχε πλέον γρήγορα και είπαμε να το μετατρέψουμε σε κλάσεις. Όλος ο κώδικας έχει παραμείνει ο ίδιος. Μιλάμε για ακριβώς τα ίδια αρχεία, απλά μεταφέραμε τα headers από τα cpp σε ξεχωριστά .h και άλλαξαν λίγο τα includes άμα κάποιος είναι άμπαλος έτσι είναι. Αν όμως γνωρίζει με τη java νοιώθει ανάπηρος. συμφωνώ απολύτως. πλέον όχι μόνο δεν τολμώ να γράψω κάτι σε java, αλλά και εάν δω κανένα πρόγραμμα γραμμένο σε java... χαιρετώ.Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: megapixel on August 23, 2012, 12:04:53 pm Να ρωτησω και εγω κατι παρομοιο, αν χρειαζεται σε αλλο θεμα ας το μεταφερει ενας διαχειριστης.
Εχω γραψει ενα προγραμμα σε C++ που χρησιμοποιει πολλες βιβλιοθηκες. Οταν τρεχω το exe στο pc μου ολα οκ, οταν το τρεχω σε αλλο pc λεει οτι λειπει το msvcp100d dll αρχειο και δε μπορει να τρεξει. Βεβαια, κατα το compile me MS Visual Studio 2010 στο output βγαζει : " 'das.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Cannot find or open the PDB file " Φυσικα βγαζει οτι λειπουν και αλλα. Δεν ξερω αν εχει σημασια αυτο. Αλλα στα errors δεν εχει τιποτα και το compile γινεται κανονικα. Μηπως χρειαζεται να ενσωματωσω και εγω τις βιβλιοθηκες στο exe? Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: BOBoMASTORAS on August 23, 2012, 17:11:40 pm Το βελτιώσαμε, έτρεχε πλέον γρήγορα και είπαμε να το μετατρέψουμε σε κλάσεις. Όλος ο κώδικας έχει παραμείνει ο ίδιος. Όπα! τι εννοείς αποφασίσατε να το μετατρέψετε σε κλάσεις? Δλδ πριν είχατε μόνο συναρτήσεις (procedural κώδικα) ? Αν είναι έτσι τότε λογικό να τρέχει πιο αργά. Η C++ είναι πιο αργή από τη C. Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 23, 2012, 17:36:00 pm Το βελτιώσαμε, έτρεχε πλέον γρήγορα και είπαμε να το μετατρέψουμε σε κλάσεις. Όλος ο κώδικας έχει παραμείνει ο ίδιος. Όπα! τι εννοείς αποφασίσατε να το μετατρέψετε σε κλάσεις? Δλδ πριν είχατε μόνο συναρτήσεις (procedural κώδικα) ? Αν είναι έτσι τότε λογικό να τρέχει πιο αργά. Η C++ είναι πιο αργή από τη C. όχι ρε συ, δεν το έθεσα σωστά. Η μοναδική αλλαδή είναι η παρακάτω. Μιλάμε για ακριβώς τα ίδια αρχεία, απλά μεταφέραμε τα headers από τα cpp σε ξεχωριστά .h και άλλαξαν λίγο τα includes Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: BOBoMASTORAS on August 23, 2012, 17:47:50 pm Πόση διαφορά βλέπετε στην ταχύτητα εκτέλεσης?
Είσαι σίγουρος ότι τα includes που άλλαξαν "λίγο" δεν επιδρούν τόσο σημαντικά? Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on August 23, 2012, 18:43:37 pm πιθανώς να είναι εκεί το πρόβλημα, δεν ξέρω, αυτό ψάχνω.
ο κορμος του κώδικα πάντως είναι ο ίδιος. η διαφορά στην ταχύτητα είναι τεραστια. 100Χ κάτι περίεργο επίσης είναι ότι όταν το τρέχω με το eclipse το οποιο από πισω κάνει cmake γίνεται compile κανονικά. Όταν το ίδιο ακριβωώς folder με τα sources το τρέξω με "g++ mainClass.cpp" χτυπάει 1.200 undefined class/function κτλ. αυτό έχει να κάνει με το διαφορετικό τρόπο παραγωγής του εκτελέσιμου της cmake? Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: Issle on August 23, 2012, 19:11:12 pm Άν τρέξεις me g++ από command-line πρέπει να δώσεις arguments για το που να βρει τον υπόλοιπο κώδικα και τις βιβλιοθήκες ώστε να κάνει compile αρχικά τον κώδικα και linking έπειτα. Δες μέσα στο makefile.
Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: BOBoMASTORAS on August 23, 2012, 21:45:58 pm πιθανώς να είναι εκεί το πρόβλημα, δεν ξέρω, αυτό ψάχνω. ο κορμος του κώδικα πάντως είναι ο ίδιος. η διαφορά στην ταχύτητα είναι τεραστια. 100Χ κάτι περίεργο επίσης είναι ότι όταν το τρέχω με το eclipse το οποιο από πισω κάνει cmake γίνεται compile κανονικά. Όταν το ίδιο ακριβωώς folder με τα sources το τρέξω με "g++ mainClass.cpp" χτυπάει 1.200 undefined class/function κτλ. αυτό έχει να κάνει με το διαφορετικό τρόπο παραγωγής του εκτελέσιμου της cmake? Καλό είναι να διαβάσετε για makefiles γενικά ώστε να καταλάβετε τι παίζει. http://www.gnu.org/software/make/manual/html_node/index.html Το cmake, όπως και το automake/autoconf είναι απλά build systems που προσπαθούν να μαντέψουν το σύστημα του χρήστη και να δημιουργήσουν τα κατάλληλα makefiles. Αν όμως σκοπεύετε να έχετε μόνο σε development το source code και δε σκοπεύετε να τον κάνετε release, τότε δε χρειάζετε να μπείτε σε τόση διαδικασία. Εγώ γενικά σε τέτοιες περιπτώσεις προτιμώ αν χρησιμοποιώ καθαρά makefiles που έχω γράψει ο ίδιος. Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: fugiFOX on October 09, 2012, 11:10:47 am Έχοντας εντοπίσει το πρόβλημα, το γράφω για μελλοντική ανάγνωση.
ο κορμος του κώδικα πάντως είναι ο ίδιος. το πρόβλημα έγκειται στο IDE που χρησιμοποιώ, συγκεκριμένα το eclipse, η διαφορά στην ταχύτητα είναι τεραστια. 100Χ κάτι περίεργο επίσης είναι ότι όταν το τρέχω με το eclipse το οποιο από πισω κάνει cmake γίνεται compile κανονικά. αλλά φαντάζομαι και τα υπόλοιπα το ίδιο θα κάνουν, και ειδικότερα στο makefile που παράγει αυτόματα. Παρότι, λοιπόν έχω βάλει στις επιλογές: optimizations "-O3" το eclipse εισάγει αυτόν τον διακόπτη μόνο στο τελευταίο στάδιο του makefile. Έφτιαξα 1 δικό μου makefile, όπως πρότεινε ο ΒΟΒ, και πέρασα το διακόπτη -O3 σε όλα τα στάδια (δλδ σε κάθε file.o: file.cpp g++ -c -O3 file.cpp) και πλέον πάει σφαιράτο. Αν είναι έτσι τότε λογικό να τρέχει πιο αργά. Η C++ είναι πιο αργή από τη C. αυτό μήπως τελικά είναι μύθος;Ψάχνοντας στο net, δεν βρήκα κάποιο benchmark που να αποδεικνύει ουσιώδη διαφορά στην απόδοση. Γενικά εάν χρησιμοποιείς STL όπου μπορείς και δεν κάνεις κάτι extreme, μάλλον οι διαφορές στο χρόνο εκτέλεσης είανι ασήμαντες Title: Re: Ενσωμάτωση όλων των βιβλιοθηκών στο εκτελέσιμο Post by: BOBoMASTORAS on October 09, 2012, 14:43:43 pm δεν είναι μύθος... η C++ είναι πιο αργή από τη C στο λέω εκ πείρας διδακτορικού. Όχι λόγω παράπλευρου συμπεράσματος, αλλά λόγω optimization που έγιναν με αυτό το σκεπτικό. Αν δοκιμάσεις να γράψεις τον κώδικα σε C θα δεις διαφορά, το πόσο σημαντική βέβαια εξαρτάται από την εφαρμογή.
Το θέμα είναι ότι μπορεί μεν η C να είναι πιο γρήγορα, αλλά δεν είναι τόσο εύκολα διαχειρίσημη σε μεγάλα project, οπότε μπορείς να βρεις το bottleneck και να γράψεις C μόνο εκεί. Επίσης τεράστιο πρόβλημα στη C είναι η μη ύπαρξη containers. Παρόλα αυτά υπάρχουν διάφορες έξυπνες υλοποιήσεις που είναι ταχύτατες. Προσωπικά επειδή στη C καταφεύγω για λόγους ταχύτητας έχω γράψει κάποιους δικούς μου (πχ cvector) με χρήση #defines. Η υλοποίηση γίνεται inline στον κώδικα και πάει πραγματικά σφαίρα. Η assembly που προκείπτει από τις κλήσεις είναι minimal Υ.γ. Δοκίμασε με flags -O6 -fomit-frame-pointer -Wall με το -O6 θα δεις κάποια διαφορά. Με το omit frame pointer η διαφορά είναι μικρή. Το -Wall είναι για να βλέπεις όλα τα warnings και δεν έχει να κάνει με την ταχύτητα. |