87 γραμμές
		
	
	
	
		
			7,8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			87 γραμμές
		
	
	
	
		
			7,8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
+++
 | 
						||
title = 'Προγραμματισμός σε C/C++ στο Linux'
 | 
						||
date = '1998-11-01T00:00:00Z'
 | 
						||
description = ''
 | 
						||
author = 'Γιάννης Εξηνταρίδης'
 | 
						||
issue = ['Magaz 09']
 | 
						||
issue_weight = 2
 | 
						||
+++
 | 
						||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
*Αρκετοί που ασχολούνται με προγραμματισμό (είτε ερασιτεχνικά, είτε επαγγελματικά) και έχουν έρθει στον κόσμο του 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 !
 |