Προγραμματισμός σε C/C++ στο Linux
Γιάννης Εξηνταρίδης exindari@ermis.math.upatras.gr
Νοέμβριος 1998
Αρκετοί που ασχολούνται με προγραμματισμό (είτε
ερασιτεχνικά, είτε επαγγελματικά) και έχουν έρθει στον
κόσμο του Linux, αναρωτιούνται ίσως τι γίνεται με την
ανάπτυξη εφαρμογών. Τα παρακάτω επιχειρούν να ρίξουν φως σε
αυτόν τον τομέα.
Το Linux προσφέρει μια πληθώρα προγραμματιστικών
εργαλείων και όπως αντιλαμβάνεστε είναι φυσικό η C/C++ να
έχει την τιμητική της στο κόσμο του Linux μια που η
πλειοψηφία των εφαρμογών (όπως εξάλλου και το ίδιο το
λειτουργικό) είναι γραμμένες σε αυτή την γλώσσα. Στο
Linux κυριαρχεί το κλασικό στύλ ανάπτυξης εφαρμογών.
Δηλαδή editing του κώδικα σε ένα απλό text editor,
compiling (από την γραμμή εντολής φυσικά) running και
debugging. Το compiling γίνεται από τον πανίσχυρο GNU
compiler (gcc αν πρόκειται για πρόγραμμα C, g++ αν
πρόκειται για πρόγραμμα C++).
Μερικά απλά παραδείγματα θα δείξουν την χρήση του. Για να
κάνουμε ένα απλό compiling αρκεί να δώοσυμε την εντολή
gcc -c hello.c (όπου hello.c ο source κώδικας μας).
Για να κάνουμε compiling + linking θα δώοσυμε την εντολή
gcc -o hello hello.c
Να τονίσουμε ότι ΠΡΕΠΕΙ να δώσουμε όνομα στο τελικό
εκτελέσιμο αρχείο που θα προκύψει. ΔΕΝ εννοείται ότι το
αρχείο θα ονομαστεί hello. Αντίθετα το default είναι να
ονομαστεί a.out.
Οι διάφορες libraries στις οποίες θα γίνει link η
εφαρμογή μας δηλώνονται με -l(όνομα library χωρίς το
πρόθεμα lib). Π.χ. Αν έχουμε γράψει ένα πρόγραμμα το
οποίο χρησιμοποιεί την I/O library της C++ θα πρέπει να
γράψουμε
g++ -o hello hello.cpp -liostream
To αρχείο που αντιστοίχει στην library iostream είναι το
libiostream.a
Αν θέλαμε να κάνουμε link με την standard C library θα
γράφαμε
gcc -o hello hello.c -lc
Oμοια το αρχείο που αντιστοίχει στην standard C library
είναι το libc.a
Από τα παραπάνω φαίνεται η λογική της διαδικασίας όταν
θέλουμε να εκτελέσουμε link σε κάποια library. Στην
πραγματικότητα τα παραπάνω ( δηλαδή -lc ή -liostream) δεν
χρειαζόντουσαν γιατί εξ' ορισμού ο gcc αυτόματα εκτελεί
link σε αυτές. Χρειάζεται όμως σε άλλες περιπτώσεις.
Ο gcc δέχεται πάρα πολλές επιλογές οι οποίες δεν είναι
δυνατόν να καλυφτούν σε ένα μόνο άρθρο. Η καλύτερη πηγή
για αυτά αποτελεί το ίδιο το manual του (ή οι man pages).
Θα τονίσουμε απλά τις πιο σημαντικές. Κάθε
προγραμματιστής που σέβεται τον εαυτό του ξέρει ότι η
εφαρμογή πρέπει να είναι όσο το δυνατόν βελτιστοποιημένη
(τόσο από άποψη ταχύτητας όσο και από άποψη μεγέθους)
Βελτιστοποίση σε ένα ορισμένα βαθμό γίνεται με την
επιλογή -Ο1 Π.χ
gcc -O1 -o [output] [input]
Ακόμα περισσότερο
gcc -O2 -o [output] [input]
Μήπως θέλουμε να αναφέρονται όλα τα warnings ? Τότε αρκεί
να δώσουμε ένα
gcc -Wall -o [output] [input]
Και το debugging ? Τι γίνεται με αυτό ? Ο GNU debugger
είναι ο gdb. Επειδή όμως χρειαζόμαστε και debugging info
προτού περάσουμε στην χρήση του χρειάζεται να δώσουμε ένα
gcc -g -o [output] [input] πρώτα και είμαστε
έτοιμοι.
Και το profiling ? Μην ανησυχείτε. Υπάρχει και αυτό.
Δώστε ένα
gcc -pg -o [output] [input]
εκτελέστε την εφαρμογή, μετά δώστε ένα gprof gmon.out
(όπου gmon.out το αρχείο που δημουργείται) και θα δείτε
ένα σωρό χρήσιμες πληροφορίες. Οπως βλέπετε τίποτα δεν
λείπει.
Ισως τα παραπάνω να φανούν λιγάκι απαρχαιωμένα στους
μοντέρνους προγραμματιστές οι οποίοι έχουν μάθει στα
(πολύ καλά ομολογουμένως) ολοκληρωμένα περιβάλλοντα, στις
σουίτες ανάπτυξης εφαρμογών κ.λπ. Η αλήθεια είναι πως
είχαν και άλλοι τις ίδιες ανησυχίες, για αυτό και
προχώρησαν σε κάτι ανάλογο. Υπάρχουν τέτοια πράγματα σε
Linux και τελείως ενδεικτικά θα αναφέρω το RHIDE (το
οποίο στον τρόπο λειτουργίας θα θυμίσει πολύ το IDE της
Borland για DOS), το xwke, τον ddd ( Data display
Debugger ), τον kdbg (K Debugger για όσους έχουν KDE στο
σύστημά τους ) κ.λπ. Δεν λείπουν επίσης βιβλιοθήκες
ρουτινών και συναρτήσεων. Όλα αυτά θα τα βρείτε στο τμήμα
Software/Programming του http://www.linuxlinks.com.
Η αλήθεια είναι πάντως πως ο GNU έχει την τιμητική του
και στον κόσμο του DOS. Πράγματι ο γνωστός DJGPP compiler
δεν είναι τίποτα παραπάνω από ένα porting του gcc στο
DOS. Για πολλά χρόνια έχει αποτελέσει την ίσως μοναδική
λύση, για 32bit εφαρμογές και φυσικά παιχνίδια στην
παραπάνω πλατφόρμα. (Π.χ. το Quake, ο πολύ γνωστός
emulator MAME κ.λπ.)
Φυσικά τα παραπάνω δεν φιλοδοξούν να καλύψουν το κεφάλαιο
"προγραμματισμός C/C++ στο Linux". Απλά αποτελούν μια
πρώτη εισαγωγή και στην πραγματικότητα μόλις που αγγίζουν
την κορυφή του παγόβουνου. Για παράδειγμα δεν
αναφερθήκαμε καθόλου σε X programming ούτε και Assembly
programming (Για το τελευταίο επιφυλλασόμεθα σε
μελλοντικό αρθράκι). Καλώς ήρθατε στον κόσμο του Gcc !