You are on page 1of 27

L i c m n

V i nh ng ng i quen s d ng h i u hnh Windows c a Microsoft nh chng em th Linux v ph n m m m ngu n m th t s l m t mn h c m i, l v cng khng km ph n th v . Qua mn h c ny, chng em c bi t v hi u thm v th gi i m ngu n m - m t mi tr ng chia s nh ng ph n m m hon ton mi n ph theo nh ng quy nh c a ring n. V c bi t, chng em c bi t n nh ng h i u hnh khc ngoi Windows nh Ubuntu, Fedora.... V c c nh ng ki n th c , chng em mu n g i l i c m n chn thnh n gi ng vin Trng Di u Linh t n tnh ch d y, a chng em n g n hn v i 1 lnh v c hon ton m i, gip chng em c thm nh ng ki n th c n n t ng c th pht tri n ti p trong tng lai.

L i ni u

L sinh vin ngnh cng ngh thng tin, cng vi c l p trnh qu quen thu c v i chng em. Tuy nhin, t tr c n nay, r t nhi u b n v c chng em m i ch bi t n vi c th c hi n cng vi c ny trong mi tr ng h i u hnh Windows c a Microsoft. V y nn, khi c ti p c n v i cc h i u hnh khc (Unix-like) qua mn h c Linux v ph n m m m ngu n m , m t cu h i lun c chng em t ra l: c th l p trnh cc ngn ng ph bi n (nh C, C++, Java, . . . ) trn c hay khng? V l , chng em tm hi u ti: Mi tr ng l p trnh C/C++ trong Linux Makefile v L p trnh ng d ng trong bi t p l n c a mn h c. V b n bo co d i y l l i gi i p cho cu h i pha trn.

Tm t t n i dung

Nh nh c n trong l i ni u, trong bo co ny, chng em th c hi n ti: Tm hi u mi tr ng l p trnh C/C++ trong Linux - Makefile v L p trnh ng d ng. N i dung cng vi c c trnh by l i qua 3 ph n sau:

Ph n 1: Mi tr ng l p trnh C/C++ trong Linux


Ph n ny trnh by cc n i dung nh m tr l i cho cu h i: Lm th no c th l p trnh C/C++ trong Linux v t o ra cc file th c thi. Ngoi ra, trong ph n ny, cng trnh by cc cng c h tr vi c l p trnh C/C++ trong Linux theo cc kha c nh: ci t, u v nh c i m c a cc cng c . Sau , l v d minh h a s d ng cng c Netbeans. K t thc ph n ny, chng ta s c ci nhn t ng quan v mi tr ng l p trnh C/C++ trong Linux v bi t cc thao tc c b n ci t v s d ng cc cng c h tr c th vi t cc chng trnh m C/C++ cng nh th c thi chng m t cch n gi n.

Ph n 2: Th vi n trong Linux
Ph n ny ni v cc th vi n h tr l p trnh C/C++ trong Linux.

Ph n 3: Makefile
Ph n ny trnh by v khi ni m, ngha v cch t o ra m t Makefile. Xen k l cc v d minh h a v cc tnh nng c a Makefile. Sau y l n i dung chi ti t.

M cl c
1. Mi tr ng l p trnh C/C++ trong Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1. Cc trnh so n th o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1. Trnh so n th o vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2. Trnh so n th o pico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.3. Trnh so n th o Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Trnh bin d ch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. M t s IDE h tr l p trnh C/C++ trong Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1. Code::Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2. Netbeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
1 1 3 4 5 5 6 7

2. Th vi n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1. Th vi n tnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. c i m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2. T o th vi n lin k t tnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.3. S d ng th vi n lin k t tnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Th vi n chia s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Th vi n lin k t ng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1. c i m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2. T o th vi n lin k t ng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.3. S d ng th vi n lin k t ng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Cc cng c cho th vi n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10
11 11 11 12 13 13 13 13 14 14

3. Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1. Bin d ch theo ch dng l nh - Bin d ch c b n . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Bin d ch s d ng Make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15
15 18

4. Debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. K t lu n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21 22

iii

1. Mi tr ng l p trnh C/C++ trong Linux


V i sinh vin chuyn ngnh cng ngh thng tin, l p trnh l m t trong nh ng k nng thi t y u c n n m v ng. V ngn ng l p trnh c sinh vin s d ng ph bi n nh t hi n nay l C/C++ v Java. Tuy nhin, trong khun kh bi bo co ny, chng em ch t p trung vo ngn ng C/C++. Nh chng ta bi t, i v i h i u hnh Windows, c r t nhi u IDE (Intergrated Development Environment) h tr vi c l p trnh C/C++ nh turboC, borland C, DevC++, Cfree, Visual Basic . . . . Ngoi ra cn c m t s IDE cng cho php so n th o v bin d ch m ngu n C/C++ b ng cch thm plug-in vo nh Eclipse, Netbeans,. . . V y, trn mi tr ng h i u hnh Linux, cng vi c l p trnh C/C++ c ti n hnh nh th no? Lm th no bin d ch file m ngu n v th c thi chng? R rng r ng, v i b t c ngn ng l p trnh b c trung v cao no, t o ra 1 file th c thi c, chng ta u ph i t o ra m ngu n r i bin d ch chng v m my (m nh phn). L p trnh C/C++ trn Linux cng khng ph i l ngo i l . V l , trong cc b n phn ph i c a Linux (v cng nh trong cc h i u hnh khc) ch c n 1 trnh so n th o v 1 trnh bin d ch l chng ta hon ton c th t o ra cho mnh nh ng chng trnh C/C++ n gi n. t ng b c ti p c n v i mi tr ng l p trnh C/C++ trn Linux, u tin, chng em s trnh by v cc trnh so n th o, trnh bin d ch r i sau l cc IDE thng d ng h tr cng vi c ny.

1.1. Cc trnh so n th o
Trong Unix cng nh Unix-like, c r t nhi u trnh so n th o, c th k ra nh: vi, pico, Emacs, gedit, . . . . Cc chng trnh so n th o ny c th c ci t r t d dng, tng t nh cc ph n m m khc b ng cu l nh sudo apt-get install x v i x l tn c a trnh so n th o m ta mu n ci. Ta cng c th ki m tra xem, trnh so n th o c ci cha b ng cch g l nh: which x cng v i x l tn c a chng trnh ta mu n ki m tra s t n t i c a n. N u k t qu tr v l ng d n n ni ch a n ngha l n c ci t v ng c l i. Khi cc trnh so n th o c ci t, ta hon ton c th s d ng chng t o ra cc file m ngu n C/C++, v i ch ph n m r ng s l .c ho c .cpp. Sau y, chng em s gi i thi u v cc trnh so n th o, giao di n v cch lm vi c v i chng. 1.1.1. Trnh so n th o vi

y l m t trong nh ng b so n th o lu i nh t trn Unix. S d ng phm l nh i u khi n qu trnh so n th o, nn m i thao tc c th c


kh i ng trnh so n th o ny, ta g: vi, r i n phm enter, giao di n ban u nh hnh 1 1

hi n trn bn phm m khng c b t c s can thi p no t con chu t, do tng i kh dng v i nh ng ng i quen s d ng giao di n h a.

Hnh 1: Giao di n khi kh i ng c a vi

Trong c a s
o ring.

lm vi c c a vi, c ba ch . M i m t ch c m t ch c nng ch

Ch l nh: vo ch ny, ta n phm Esc. Trong ch ny, ta thao tc cc ch c nng: di chuy n con tr chu t, xa m t k t ho c c dng k t . D i y l m t s phm l nh thng d ng:

* S d ng cc phm mi tn ho c * phm l ho c space: di chuy n ti n ln 1 k t * phm h ho c backspace: di chuy n li v 1 k t * phm j : di chuy n xu ng m t dng * phm k ho c -: di chuy n ln m t dng * phm x: xa 1 k t * phm dd: xa ton b dng * g phm i: chn l nh vo bn tri con tr * phm a: chn l nh vo bn ph i con tr * phm R: thay th o n l nh khi b n g * phm o: chn m t dng tr ng sau dng hi n t i * phm O: chn m t dng tr ng trn dng hi n t i

Ch nh p: vo ch ny, t ch l nh, ta g cc phm ch c nng d i y:

Trong ch ny: ta th c hi n thao tc so n th o, s a ch a n i dung. Ch dng: vo ch ny, ta g k t : Ch ny lm vi c tng t nh menu File trong cc c a s Windows, v i cc phm ch c nng nh sau: ng d ng trn

* :q - thot kh i chng trnh v lu l i m i s thay i. * :q! - thot kh i chng trnh m khng c b t c s thay i no. * :w - lu l i thay i. Phm ny cng th c hi n ch c nng lu file v t
tn cho file, b ng cch g: 2

* :wq - lu l i thay i v thot.

:w <ten_file.phan_mo_rong>

m chng trnh ny, trong c a s terminal, g:

vi ho c m m t file c s n: vi <ten_file.phan_mo_rong> v g phm enter, c a s lm vi c c a vi s hi n ln. Khi , b t u so n th o, ta n phm a <enter> vo ch nh p. Giao di n lm vi c c a vi nh trong hnh 2

Hnh 2: Giao di n lm vi c c a vi

1.1.2. Trnh so n th o pico

y l chng trnh so n th o th i n t r t thng d ng Cng s d ng phm l nh nh vi, nhng d s d ng hn. Cng tng t nh vi, m , ta g vo c a s terminal : pico. ho c
$pico [tn file] N u [tn file] t n t i, n s c m . Cn khng, n s c t o m i. C a s pico xu t hi n. t h p phm thng d ng trong pico:

Sau y l m t s

S d ng phm mi tn ho c cc t h p phm: ctrl+f, ctrl+b, ctrl+n, ctrl+p di chuy n ti n ln, li v m t k t , xu ng dng ti p theo ho c v dng tr c . T h p phm ctrl+v: li v 1 trang 3

Hnh 3: Giao di n lm vi c c a trnh so n th o pico T h p phm ctrl+y: ti n ln 1 trang Ctrl + k: xa dng hi n t i Crtl + u: ph c h i l i o n text b xa cu i cng. Ctrl + x: thot kh i pico. N u file cha c lu, n s thng bo. N u ng lu b n n phm Y, ng c l i n phm N. 1.1.3. Trnh so n th o Emacs

y l m t trong nh ng trnh so n th o vn b n m nh nh t hi n nay trong Unix Th ng dng so n th o chng trnh v i nhi u tnh nng dnh cho l p trnh D
vin c tch h p s n.

M ts

s d ng, c th ch y b ng giao di n c a n, giao di n c a ng i dng ho c giao di n dng l nh c b n c a ng i dng. t h p phm thng d ng:

ctrl+f: ti n ln 1 k t ctrl+b: li v 1 k t esc+f: ti n ln 1 t esc+b: li v 1 t ctrl+n: ti n ln 1 dng ctrl+p: li v 1 dng ctrl+v: t i mn hnh ti p theo esc+v: quay l i mn hnh tr c phm delete: xa li ctrl+d: xa ti n esc+delete: xa li 1 t esc+d: xa ti n 1 t 4

ctrl+k: xa t v tr con tr n cu i dng ctrl+y: tng t ctrl+u trong pico Trn y l m t s trong nhi u trnh so n th o cho php chng ta c th t o ra m ngu n. Ti p theo, chng em s trnh by v trnh bin d ch t cc m ngu n ny t o ra file th c thi trong Linux.

1.2. Trnh bin d ch


Linux s d ng hai trnh bin d ch c b n, l: gcc v g++.

gcc (GNU Compiler Collection) l m t b

gcc c ch n lm trnh d ch chnh th c c a GNU v c h u h t cc h Thng th ng khi ci t linux, n s


Unix, Unix-like ch n lm trnh d ch tiu chu n.

cc trnh bin d ch m ngu n m cho cc ngn ng l p trnh. Tn g c c a n l GNU C Compiler b i v lc u n ch s d ng cho ngn ng l p trnh C. Cc phin b n m i hn sau ny m i m r ng ra d ch nhi u ngn ng khc n a nh: C++, java, Fortran, . . . i u hnh

Khi c cc trnh bin d ch ny, cng nh c file m ngu n, chng ta s


$ gcc [tuy chon] ten_file_ma_nguon.c $ g++ [tuy chon] ten_file_ma_nguon.cpp trong , cc [tuy chon] c th l:

t ng ci trnh bin d ch gcc. Nhng n u cha c th ta hon ton c th ci m t cch bnh th ng nh ci t cc chng trnh khc (i u ny c trnh by m c 1.1 ). ti n hnh bin d ch nh sau. Trn c a s terminal, ta chuy n n th m c ch a file m ngu n, r i bin d ch b ng cu l nh:

-c: Gip trnh bin d ch file va th t c t o m t object file. File object c ph n m r ng l .o ho c .obj. -o <name>: <name> l tn m ta t cho file ch y th c thi thay cho tn m c nh (tn file m c nh l a.out). -g: T o chng trnh v c hi n thng bo l i (n u c). -I <directory name>: Thm th m c c bi t (bao g m c ng d n) tm ki m. Trnh bin d ch s tm trong th m c cc file c khai bo u file ngu n (ch a code). M c nh trnh bin d ch s search trong /usr/include -L <directory name>: Tm th vi n (Tng t -I), m c nh l /usr/lib

1.3. M t s IDE h tr l p trnh C/C++ trong Linux


Cng tng t nh trong h i u hnh Windows, trong Linux cng c m t s IDE h tr cng vi c l p trnh ni chung v l p trnh C/C++ ni ring. M t trong s , c th k ra nh:

KDevelop Gambas

Code::Blocks Eclipse Netbeans . . .


Tuy nhin, do th i gian c h n, chng em ch i su tm hi u hai cng c , l: Code::Blocks v Netbeans. 1.3.1. Code::Blocks

Code::Blocks l mi tr ng pht tri n tch h p ngu n m Code::Blocks c vi t b ng C++ s i m n i b t c a CB bao g m:

mi n ph dnh cho h i u hnh Windows v Linux. Code::Blocks h tr GCC (MinGW / Linux GCC), VC++ Toolkit, Digital Mars Compiler, Borland C++ v Open Watcom, LCC v Intel C++ Compiler. d ng framework wxWidget. B n thn n khng c th d ch(compile) g c nhng n tch h p cc chng trnh : chng trnh so n th o, chng trnh d ch, chng trnh b t l i, . . .

Cross-platform, n c th run trn m i h i u hnh, bao g m: Mac, Linux, Windows,. . . R t g n nh , ch c ng 70Mb. C th ch n b t c compiler bin d ch source, m c nh l gcc. H tr format source code r t ti n l i cho vi c copy code t cc site khc v , v ch nh s a l i. N cng gi ng nh VC++, chng ta khng ph i tr b t c m t ph no download v s d ng n.

Ci t codeblocks trn Ubuntu:

$sudo apt-get install codeblocks Ho c c th vo Sorfware center, search code block, sau ch n install. H th ng s t ng ci t code::blocks d ng: minh h a hnh 4, 5, 6, 7, 8, 9 Sau khi ci t v kh i ng chng trnh code blocks, c a s chng trnh : t o project m i ta vo New Project. . . ho c kch vo bi u t ng Newfile ch n project. Sau s hi n ra c a s : 5 Nhn bn gc tri, ta th y project c a chng ta v trong folder Sources, c m t file m c nh tn l main.cpp. y l file m c nh cho chng trnh in ra Hello World n gi n m Code::Blocks generate. Cc b n c th thm b t c code g vo file ny v bin d ch l i. bin d ch chng trnh trong Code::Blocks, chng ta ch vi c nh n F9 l xong. Code::Blocks s t ng save file v compile. Nh n F10 run s th y c k t qu nh trn mn hnh. (Hnh 9) N u chng trnh b l i, s c thng bo trong c a s Build messages. 6

Hnh 4: Giao di n khi kh i ng c a Code::Blocks

Hnh 5: T o project m i

Hnh 6: Ch n ngn ng 1.3.2. Netbeans

NetBeans c vi t hon ton b ng Java v c th NetBeans Platform cho php cc NetBeans IDE h

ch y c trn nhi u h i u hnh khc nhau nh l Windows, OS X, Linux, Solaris v n n t ng khc h tr tng thch JVM, l m t mi tr ng pht tri n tch h p (IDE) cho pht tri n v i Java, JavaScript, PHP, Python (khng cn c h tr sau NetBeans 7), Groovy, C, C++, Scala, Clojure v nh ng ngn ng khc. ng d ng c pht tri n t m t t p h p cc m-un thnh ph n. Cc ng d ng d a trn n n t ng NetBeans (bao g m c IDE NetBeans) c th c m r ng b i cc nh pht tri n bn th ba. tr pht tri n c a t t c cc lo i ng d ng Java (Java SE (bao 7

Hnh 7: Nh p tn project

Hnh 8: Ch n trnh bin d ch

Hnh 9: Giao di n lm vi c c a Code::Blocks g m c JavaFX ), Java ME, web, EJB v cc ng d ng i n tho i di ng ) ra kh i h p. c th ti s d ng ph bi n cho cc ng d ng my tnh bn, cho php cc nh pht tri n t p trung vo logic c th ng d ng c a h . Trong , cc tnh nng c a n n t ng ny l: Qu n l giao di n ng i dng (v d nh cc menu v thanh cng c ) Qu n l s d ng ci t Qu n l lu tr (ti t ki m v t i b t k lo i d li u) C a s qu n l Khun kh thu t s (h tr b c-by-step h p tho i) 8

N n t ng cung c p cc d ch v

Th vi n NetBeans tr c quan

Ci t Netbeans tng t

Tch h p cng c pht tri n

nh Code::Blocks. Tuy nhin, c th so n th o m ngu n C/C++, c n ci thm cc plugin (minh h a hnh 11, 12)

Hnh 10: Giao di n kh i ng c a Netbeans

Hnh 11: Ci Plugin

Hnh 12: Ci Plugin (ti p)

d ng: minh h a hnh ??, 14, 15 ch y chng trnh: n phm F6 ho c Shift+F6

Hnh 13: T o project m i

Hnh 14: Ch n ngn ng v nh p tn project

Hnh 15: Giao di n lm vi c c a NetBeans Nh v y, chng ta c th vi t m ngu n C/C++ v bin d ch m ngu n thnh cc file th c thi. Tuy nhin, cn m t v n quan tr ng trong qu trnh l p trnh, l s d ng th vi n. B i c r t nhi u chng trnh c vi t ra, n u khng s d ng th vi n v i cc hm c s n ho c l m ngu n s r t di v ph c t p ho c khng th vi t h t c. V y, vi c s d ng th vi n trong khi l p trnh trong mi tr ng Linux nh th no? M c 2 s ni r hn v v n ny.

2. Th vi n
Nh trnh by cc t p tin th vi n. pha trn, t o ra chng trnh th c thi, chng ta c n ph i c

10

Th vi n g c c a C/C++ trn linux chnh l glibx, th vi n ny cung c p cho ng i Th vi n chia s

dng r t nhi u l i g i h th ng . Cc th vi n trn linux c t chc d i d ng tnh (static library) v th vi n chia s (shared library) v ng (dynamic library), th vi n tnh c lin k t c nh vo trong chng trnh trong ti n trnh lin k t, nn cn g i l th vi n lin k t tnh. c n p vo b nh trong khi chng trnh b t u th c hi n v cho php cc ng d ng cng chia s lo i th vi n ny . nh ch khi no chng trnh g i t i.

Th vi n lin k t tnh c n p vo b
2.1. Th vi n tnh
2.1.1. c i m

Th vi n lin k t tnh l cc th vi n khi lin k t trnh bin d ch s Chng trnh s Mu n s


trnh. d ch xong. th c thi c a hm trong th vi n a vo chng trnh chnh.

l y ton b m

d ng th vi n lin k t tnh ch y c l p v i th vi n sau khi bin

d ng nh ng ch c nng m i c a th vi n, ta ph i bin d ch l i chng

2.1.2. T o th vi n lin k t tnh

Gi

s , chng ta c 2 file m ngu n ch a hm(cong.c) va (nhan.c)

/* cong.c */ int cong( int a, int b ) { return a + b; } /* nhan.c */ long nhan( int a, int b ) { return a * b; }

Th c hi n bin d ch Dng l nh ar Dng l nh nm


$nm libfoo.

t o ra hai t p tin th vi n i t ng .o

$ gcc c cong.c nhan.c t o th vi n lin k t tnh libfoo.a

$ ar cvr libfoo.a cong.o nhan.o xem l i k t qu

11

C th dng l nh file xem file libfoo.a l lo i g Sau khi c c th vi n libfoo.a, chng ta lin k t l i v i chng trnh.
V d : $ gcc program.o oprogram libfoo.a

Chng ta c th

s d ng ty ch n l ch nh th vi n khi bin d ch thay cho cch trn. Tuy nhin libfoo.a khng n m trong th m c th vi n chu n, c n ph i k t h p v i ty ch n L ch nh ng d n tm ki m th vi n trong th m c hi n hnh. D i y l cch bin d ch: $ gcc program.c oprogram L lfoo

2.1.3. S d ng th vi n lin k t tnh

m t chng trnh no g i c cc hm trong 2 th vi n .o trn, chng ta c n t o m t t p tin header .h khai bo cc nguyn m u hm ng i s d ng tri u g i: /* lib.h */ int cong(int a, int b); long nhan(int a, int b);

Cu i cng, t o ra chng trnh chnh program.c tri u g i hai hm ny.


/* program.c */ #include <stdio.h> #include "lib.h" int main () { int a, b; printf("Nhap vo a : scanf("%d", &a); printf("Nhap vo b : scanf("%d", &b); printf("T ng %d + %d printf("Tich %d * %d return 0; }

"); "); = %d\n", a, b, cong(a, b)); = %ld\n", a, b, nhan(a, b));

Chng ta bin d ch v lin k t v i chng trnh chnh nh sau:


$ gcc c program.c $ gcc program.o cong.o nhan.o oprogram

Sau th c thi chng trnh


$ ./program 12

2.2. Th vi n chia s

Cn g i l th vi n dng chung C nhi u l i nhu n hn th vi n tnh T n t ti nguyn h th ng,v s d ng t khng gian a. S d ng t n t b nh M ngu n trong th vi n dng chung d b o tr Vi c xy d ng th vi n dng chung c s khc bi t so v i th vi n tnh
Khi bin d ch file i t ng s d ng ty ch n -fpic c a gcc s t o ra m c l p v tr, t c th lin k t ho c s d ng b t k ch no Khng lo i b file i t ng v khng s d ng cc ty ch n fomit, -frame, pointer c a gcc S d ng ty ch n share, -soname c a gcc S d ng ty ch n Wl c a gcc truy n tham s t i trnh lin k t ld Th c hi n ti n trnh lin k t d a vo th vi n C, s d ng ty ch n l c a gcc

s d ng th vi n dng chung m i chng ta quay l i chng trnh ki m tra, chng ta c n h ng trnh lin k t n th vi n no s d ng v tm n u, v v y chng ta s d ng ty ch n l v L $gcc g errtest .c orrtest -L .-lerr

Cu i cng,

ch y ta ch cho ld.so ni tm th vi n dng chung

$LD_LIBBRARY_PATH= $(pwd)./errtest

2.3. Th vi n lin k t ng
2.3.1. c i m

Th vi n lin k t ng chi m t ti nguyn b nh Cc hm trong th vi n lin k t ng khng tr c ti p a vo chng trnh lc bin Trnh lin k t lu thng tin lin k t n cc hm trong th vi n lin k t ng H i u hnh s n p cc trnh lin k t c n thi t vo b nh
d ch v lin k t

2.3.2. T o th vi n lin k t ng

Khi bin d ch t p tin i t ng


$ gcc c fpic cong.c nhan.c

a vo th vi n lin k t ng, chng ta ph i thm ty ch n fpic (PIC- Position Independence Code m l nh v tr c l p). V d : bin d ch l i 2 t p tin cong.c v nhan.c

13

t o ra th vi n lin k t ng, chng ta s d ng ty ch n shared.

N u t p tin c s n tr c th khng c n dng n ty ch n o. V d : t p tin


libfoo.so

$ gcc shared cong.o nhan.o -olibfoo.so

By gi

$ gcc shared cong.o nhan.o libfoo.so chng ta c th vi n lin k t ng libfoo.so. Bin d ch l i chng trnh (program.c)nh sau: $ gcc program.c oprogram L. libfoo

2.3.3. S d ng th vi n lin k t ng

Khi H

i u Hnh n p chng trnh, n s tm th vi n trong h th ng .

N u th vi n n m trong th m c hi n hnh th ta ph i a vo bi n mi tr ng
LD_LIBBRARY_PATH

V d : th vi n libfoo.so

Ki m tra xem H
$ ldd program

$ LD_LIBRARY_PATH=.: $ export LD_LIBRARY_PATH i u Hnh c th tm ra t t c cc th vi n lin k t ng m chng trnh s d ng hay khng:

R i ch y chng trnh s
$./program

d ng th vi n lin k t ng ny:

M t khuy t i m c a vi c s d ng th vi n lin k t ng l th vi n ph i t n t i trong ng d n H i u Hnh tm ra khi chng trnh c tri u g i. N u khng tm th y th vi n, H i u Hnh s ch m d t ngay chng trnh cho d cc hm trong th vi n cha c s d ng. Ta c th ch ng n p v g i cc hm trong th vi n lin k t ng m khng c n nh vo H i u Hnh b ng cch g i hm lin k t mu n.

2.4. Cc cng c cho th vi n

Cng c
phn.

nm: li t k ton b cc tn hm c m ha trong file i t ng v nh

Cng c

C php s d ng: nm [option] file ar: t o v ch nh s cc file lu tr

Cng c Cng c

C php s d ng: ar{dmpqrtx}[thnh vin ] tn file idd: li t k cc th vi n chia s m m t chng trnh yu c u m ch y , v h u ch hn nhi u so v i l nh nm C php s d ng: idd [option] file idconfig: xc nh r cc lien k t ng c yu c u b i th vi n c chia s n m trong cc th m c /usr/lib v /lib 14

3. Makefile
m c 1, chng ta bi t cch t o v bin d ch m t file m ngu n n gi n. n ph n ny, chng em s trnh by su hn v cch bin d ch sau khi tm hi u v cc th vi n. Sau y l n i dung chi ti t. Nh chng ta bi t, m t trong nh ng cng vi c quan tr ng c a ng i l p trnh l chuy n cc file ngu n thnh cc file chng trnh c th th c thi c. Qu trnh ny s chuy n nh ng cu l nh c vi t theo ngn ng g n gi v i con ng i sang d ng m h th ng my tnh c th hi u v th c thi c. Ng i ta g i l qu trnh bin d ch. V cng c m ng i l p trnh s d ng th c hi n cng vi c ny c g i l trnh bin d ch. Bin d ch cc chng trnh C/C++ trong mi tr ng Linux c chia thnh 2 d ng l n, l:

Bin d ch theo ch Bin d ch s


by m c 1).

dng l nh s d ng trnh bin d ch gcc ho c g++ ( trnh

d ng ti n ch make c a cc h i u hnh Unix-like.

3.1. Bin d ch theo ch dng l nh - Bin d ch c b n


N i dung ny c c p m c 1. n y, chng em s a ra v d minh h a r hn cho ph n l thuy t , b t u v i tr ng h p n gi n nh t, tr ng h p file m ngu n khng c cc file header.

Gi

s , chng ta c 1 file m ngu n nh sau:

#include <iostream> using namespace std; int main() { cout << hello world << endl ; return 0; }

File ny c lu d i tn: hello.cpp.

th c thi file m ngu n ny, chng ta s bin d ch n. Trong ch bin d ch theo dng l nh, chng ta s bin d ch trn c a s terminal v i cu l nh nh sau: g++ hello.cpp

Khi , trong cng th m c v i file m ngu n hello.cpp, chng ta s


./a.out

th y xu t hi n thm 1 file c tn l: a.out. y chnh l file th c thi chng trnh m chng ta v a bin d ch c. ch y n, s d ng cu l nh:

Ch l: n u chng ta khng t tn cho file th c thi, h


g++ hello.cpp -o hello 15

th ng s m c nh tn file lun l: a.out. t tn, chng ta s d ng ty ch n: -o, nh sau:

ho c: g++ -o hello hello.cpp

Tuy nhin, chng ta nn t ty ch n ny

cu i cu l nh th hn, b i v, khi b n vi t u th r t c th , h th ng s b qua tn b n t m t tn file th c thi c a b n theo m c nh, cn file th c thi b n t tn s b ghi b i file m ngu n.

l tr ng h p b n bin d ch 1 file m ngu n. V y n u chng trnh c a chng ta c nhi u hn 1 file m ngu n th s lm nh th no? Trong tr ng h p , chng ta ch c n ghi h t cc tn file m ngu n trong cu l nh, v d nh sau: g++ hello.cpp util.cpp util2.cpp -o hello V by gi , chng ta s cng c ci nhn c th hn v qu trnh bin d ch. Ti n trnh: cc file trung gian

trnh bin d ch C/C++ bin d ch cc file m ngu n ra chng trnh c th th c thi c c n tr i qua cc giai o n sau: 1. Pre-process: giai o n ti n x l, giai o n ny th c hi n nhi m v lo i b cc ch thch, pht tri n cc macro #define, #include. . . 2. Compile: giai o n chuy n i m ngu n v xy d ng u ra b ng h p ng . 3. Assemble: t file h p ng v a nh n c,trnh bin d ch xy d ng file i t ng.

Nh v y, qu trnh bin d ch th c ch t l m t chu i ti n trnh g m nhi u b c. Qu

4. Link: xy d ng file th c thi b ng cch lin k t t t c cc file i t ng

trnh bin d ch c th c d ng t i b t k m t giai o n no b ng cch s d ng ty ch n sau: -E : d ng sau giai o n pre-process. N s output m ngu n ra c a s terminal. -S: dng sau giai o n compile. N s cho ra h p ng c a m i file ngu n c cng tn v i file ngu n nhng c ph n m r ng l .s -c: d ng sau giai o n assemble. N s cho ra m t file i t ng cho m i file ngu n c cng tn nhng c ph n m r ng l .o

hi u r hn, chng ta s d ng l i cc giai o n bin d ch chng trnh hello.cpp. Trong c a s terminal, chng ta g: g++ -E hello.cpp Nh trong hnh, cu l nh #include<iostream> c thay th b i m ngu n c t o ra b i th vi n <isotream>.

Ti p theo, chng ta g:
g++ -S hello.cpp

16

Cu l nh ny t o ra m t file c tn l: hello.s. xem c file ny, chng ta s d ng l nh less nh sau: less hello.s

Ti p theo, chng ta s
g++ -c hello.cpp

Trn hnh, chng ta nhn th y m h p ng c t o ra b i trnh bin d ch. t o ra file i t ng.

Cu l nh ny t o ra file hello.o. File ny ch a m my v c th c xem b ng cch g: hexdump hello.o Cu l nh ny s chuy n cc s nh phn sang s h hexa.

By gi , lin k t file i t ng thnh 1 chng trnh th c thi.


c 1 file i t ng. g++ hello.o o hello

y, chng ta ch

Cu l nh ny s t o ra m t file th c thi c tn l hello. Chng ta c th xem n b ng cch s d ng l nh hexdump nh trn ho c c th ch y tr c ti p b ng cu l nh ./hello trnh by. Ty ch n bin d ch Ngoi cc ty ch n v a trnh by

-Wall: ch

pha trn, cn c nhi u ty ch n h u ch khc.

ra t t c cc c nh bo bin d ch.

-O hay -O1: t i u chng trnh.


Ph thu c

Ty ch n ny r t h u ch cho vi c tm cc l i bin d ch m c th c b qua b i trnh bin d ch.

Thng th ng, m t project C/C++ c kch th c l n s Gi

c s ph thu c l n nhau gi a cc file m ngu n v cc th vi n. S ph thu c ny x y ra khi m ngu n trong m t file tham chi u n m t ho c nhi u i t ng c khai bo ho c nh ngha trong m t file m ngu n khc. V l do , th t m chng ta bin d ch v lin k t cc file ng m t vai tr h t s c quan tr ng.

s chng ta c 5 file m ngu n, trong , file main.cpp ch a hm main v 4 file khc l: util_A.cpp, util_B.cpp, util_C.cpp, util_D.cpp. S ph thu c c a chng c minh h a trong hnh 16. i u hnh Linux c m t cng c c xy d ng s n u qu n l nh ng cng vi c ph c t p nh v y, g i l make.

17

Hnh 16: S ph thu c gi a cc file m ngu n

3.2. Bin d ch s d ng Make


Basic Make v Makefile Ti n ch make c thi t k qu n l m t l ng l n cc file m ngu n. N t ng xc nh xem ph n no c a chng trnh c n c bin d ch l i v a ra cc cu l nh bin d ch l i chng. Ti n ch make th ng s d ng file c t tn l: makefile ho c Makefile bi u di n s ph thu c gi a cc file m ngu n. Cc file ny bao g m m t danh sch cc lu t th c thi cc cu l nh c a ra s n khi c g i. Chng c nh d ng nh sau: ten_luat: [ danhSachCacPhuThuocLuat] [danhSachCacPhuThuocFile] [tab][cau_lenh] Trong ,

ten_luat: cn g i l target, c th

danhSachCacPhuThuocLuat: danh sch cc lu t khc m lu t ny ph thu c vo danhSachCacPhuThuocFile: danh sch cc file c n c th c thi lu t ny. d u tab b t bu c ph i c cho lu t ny c th th c thi c. l nh th c thi Chng ta th c thi nh ng lu t ny b ng cch s th c ti n ch make. make c g i C v

l b t c tn g nhng thng th ng, ng i ta hay t trng v i tn c a cc file i t ng (.o). M i target s km theo 0 ho c nhi u cu l nh th c thi.

m khng c tham s km theo s th c hi n lu t u tin trong Makefile. Cn n u make c theo sau b i tn c a m t lu t th n s th c thi lu t y.

t m th ng nhng m t c i m quan tr ng c a cc makefile l nh ng cu ch thch c th c thm vo lm r cc cng vi c khc nhau trong qu trnh bin d ch project. Cc cu ch thch c kh hi u b ng d u #.

Php gn

Makefile cho php nh ngha cc bi n v gn gi tr


18

cho n.

CC = gcc LIBS = "-Incurses - Im" echo ${CC}

V d
CC = gcc LIBS = -lpthread TARGET = prog OBJS = main.o thread.o ${TARGET}: ${OBJS} ${CC} ${LIBS} o ${TARGET} ${OBJS} Sau y, l m t v d s d ng makefile.

Chng ta dng trnh so n th o trn Linux (c th


c n i dung nh sau: # our first makefile hello: hello.cpp g++ hello.cpp -o hello

l vi, pico, . . . ) t o m t makefile

Sau , chng ta th c thi makefile ny, b ng cu l nh:


make

L nh make khng c tham s

th c thi lu t u tin trong makefile. Sau khi th c hi n lu t ny s sinh ra file th c thi. N u ch nh v y thi th ti n ch make khng th t h u ch cho l m ngoi vi c gi m th i gian nh my cho m i l n bin d ch file m ngu n. Tuy nhin, make c th lm c nhi u hn th . V d , make c th bi t t l n bin d ch cu i cng, file m ngu n c a b n c thay i g hay khng? Gi , chng ta g l nh make l i m t l n n a, chng ta s nh n c k t qu nh sau. make lm c i u ny b ng cch so snh th i gian thay i c a file output hello v i th i gian thay i c a file m ngu n hello.cpp. V th , n u chng ta touch file ny thay i th i gian s a i c a n th chng ta c th nh l a c makekhi bin d ch l i. touch hello.cpp make Nhn chung, make so snh th i gian thay i c a m i file c nh danh trong danh sch ph thu c v i th i gian thay i c a file output c th c hi n b i lu t . N u c b t k file ph thu c no c s a i n s thi hnh l i cu l nh c nh ngha b i lu t .

Ti p theo, chng ta s xem cch v n d ng make trong tr ng h p c nhi u file.

u tin, t o m t file m i t tn l util.cpp ch a m l nh nh sau:


19

#include <iostream> using namespace std; void emphasize() { cout << "!!!" << endl ; }

Sau , t o m t file khc t tn l: util.h c n i dung nh sau:


void emphasize();

Ti p n, m

file hello.cpp b ng trnh so n th o v s a n v i n i dung nh sau:

#include "util.h" #include <iostream> using namespace std; int main() { cout << "Hello World"; emphasize(); return 0; }

Nh v y, danh sch cc file m ngu n c a chng ta hi n t i bao g m: hello.cpp, M


makefile b ng trnh so n th o r i s a n l i nh sau:

util.cpp v util.h. Gi , chng ta s thm nh ng file ngu n ny vo makefile chng ta v a t o.

# our first makefile - version 2 hello: hello.o util.o g++ hello.o util.o o hello hello.o: hello.cpp g++ -c hello.cpp util.o: util.h util.cpp g++ -c util.cpp clean: rm *.o hello File makefile ny minh h a r rng hn cc ph thu c c s d ng nh th no. xem khi th c hi n cu l nh make th i u g s x y ra.

Sau y, chng ta s
make

1. make th c thi lu t u tin n tm th y, 20

y l l nh c tn: hello

2. hello c cc ph thu c: hello.o v util.o. N u nh ng file ny khng c li t k ra th make s tm m t lu t m ni cho n bi t cch xy d ng chng. Gi s , c hai file khng c li t k. 3. u tin, make tm lu t xy d ng hello.o. Lu t ny tm th y c d i. pha

4. Lu t ny ph thu c vo hello.cpp. Do hello.cpp c li t k r i nn cu l nh th c thi v m t file i t ng hello.o c t o ra. 5. Sau , make quay l i lu t hello v th y file util.o v n cha c li t k, n l i ti p t c i tm lu t xy d ng file ny. 6. Trong lu t util.o chng ta th y n ph thu c vo util.h v util.cpp. Nh ng file ny c li t k, v v y cu l nh c th c thi v file util.o c t o ra. 7. Cu i cng c hai file hello.o v utl.o c m t. V th , lu t hello thi hnh cu l nh c a n v lin k t cc file i t ng thnh m t file th c thi c t tn l hello.

Dng cu i cng c a file makefile l lu t clean. Lu t ny s


t ng v th c thi. Lu t clean th ng r t h u ch.

d n d p cc file i

4. Debug

M t chng trnh debug l m t ph n m m cho php ta nhn th y nh ng g ang Trong Linux,


gdb. di n ra bn trong 1 chng trnh trong khi n ang th c thi ho c khi n g p l i. debug cc chng trnh vi t b ng C/C++, chng ta s s d ng

21

5. K t lu n
Trn y l nh ng tm hi u c a chng em v ti: Mi tr ng l p trnh C/C++ trong Linux - Makefile - L p trnh ng d ng. Qua y, chng em bi t cch l p trnh C/C++ s d ng cc trnh so n th o v trnh bin d ch dng l nh gcc/g++. Ngoi ra, chng em cn bi t cch s d ng cc IDE h tr cng vi c l p trnh nh Code::Blocks hay Netbeans. c bi t, chng em cn lm quen c khi ni m Makefile v cch s d ng ti n ch Make m t cch n gi n. Tuy nhin, do th i gian khng c nhi u, v nh ng ki n th c cn cha hon ch nh nn ch c ch n s khng kh i nh ng thi u xt. Chng em r t mong nh n c l i nh gi, gp c a c bi bo co ny c hon thi n hn n a. Chng em xin chn thnh c m n c!

22

Ti li u
[1] http://en.wikipedia.org/wiki/NetBeans, l n truy nh p cu i: ngy 20/11/2012. [2] http://en.wikipedia.org/wiki/Code::Blocks, l n truy nh p cu i: ngy 20/11/2012. [3] http://diendan.congdongcviet.com/showthread.php?t=16222, l n truy nh p cu i: ngy 20/11/2012. [4] http://vi.scribd.com/doc/77914649/89/Th%C6%B0-vi%E1%BB%87n-lienk%E1%BA%BFt, l n truy nh p cu i: ngy 23/11/2012. [5] http://tailieu.vn/xem-tai-lieu/su-khac-nhau-co-ban-giua-lap-trinh-c-trong-linux-vawindows.607685.html, l n truy nh p cu i: ngy 23/11/2012. [6] Computer Science Department. The Linux Programming Environment. Texas State University. [7] Richard Stones Nei Matthew. Beginning Linux Programing. Wiley Publishing, 10475 Crosspoint Boulevard, 2004.

You might also like