You are on page 1of 30

Lp trnh C/Linux

Trnh by: TS. NG B HNG Website: http://sites.google.com/site/nbhung

Lp trnh C/Linux

Lp trnh C/Linux
Lp trnh C Cng c cn thit Trnh bin dch gcc Tp tin tiu Tp tin th vin hm Tin ch make Tp tin makefile Macro
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

Lp trnh C/Linux
Lp trnh C Cng c cn thit Trnh bin dch gcc Tp tin tiu Tp tin th vin hm Tin ch make Tp tin makefile Macro
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

Cng c cn thit
Trnh son tho vn bn (text):
vi, gedit, emacs, geany,...

Trnh bin dch:


gcc/GNU, cc/Sun, bcc/Borland g++/GNU, CC/Sun

Th vin chun ca ngn ng C


glibc

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

Bin dch chng trnh n gin


gcc hello.c
To ra tp tin thc thi a.out
/*hello.c*/ #include <stdio.h> main() { printf("Hello, world!\n"); return 0; }

gcc -o hello hello.c


To ra tp tin thc thi hello

gcc -c hello.c Thc thi


./a.out ./hello
22/10/2010

To ra tp tin m i tng hello.o

Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

M hnh bin dch C


Tin x l m lnh: Loi b ghi ch, chn m ngun ca cc tp tin tin include, ... ... c include, Bin dch m ngun c tin x l thnh m my To thnh m i tng, c phn m rng l .o Lin kt cc hm c tham kho li vi nhau to thnh chng trnh thc thi

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

Cc ty chn ca gcc
-Wall: hin th ton b cc warning -ansi: S dng C chun ANSI -o: t tn cho tp tin kt qu bin dch -c: To cc tp tin i tng, khng lin kt -lm: Lin kt vi th vin ton, nu trong chng trnh c #include math.h

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

V d v gcc
gcc -o hello hello.c
T ra tp tin thc thi hello

gcc -c hello.c bonjour.c chao.c


To ra cc tp tin hello.o bonjour.o chao.o

gcc hello.o bonjour.o chao.o -o helloworld


Lin kt 3 tp tin m i tng to thnh mt tp tin thc thi helloworld Tp tin m i tng gip chnh sa mt tp tin khng cn bin dch li cc tp tin khc
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

Tp tin tiu (header file)


Cha cc nh ngha hng, cc khai bo v cc hm h thng hoc hm th vin m mt chng trnh C c th gi s dng Lu tr mc nhin th mc chun /usr/include v cc th mc con ca th mc ny S dng ty chn -I khi bin dch tham kho n cc tp tin tiu mt th mc bt k
gcc -I/usr/openwin/include myprog.c

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

Lp trnh C/Linux

Tp tin th vin hm
Cha cc hm c bin dch trc c th c s dng li bi cc chng trnh C khc m khng cn phi vit li Cc tp tin th vin hm chun ca h thng Linux c lu trong th mc /lib hoc /usr/lib Qui tc t tn:
Th vin tnh (static librabry): libIndicat.a Th vin chia s (shared librabry): libIndicat.so libc.a - Th vin hm C; libm.a - Th vin v ton
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

10

Lp trnh C/Linux

S dng th vin hm
M t ng dn n tp tin th vin hm
gcc -o myprog myprog.c /usr/lib/libm.a

Dng ty chn -l v indicat ca th vin hm


gcc -o myprog myprog.c -lm
Tm trong th mc th vin hm chun h thng; S dng th vin chia s libm.so trc nu tn ti, nu khng s dng th vin tnh libm.a

Dng ty chn -L b sung th mc cha th vin hm: gcc -o myprog -L/usr/openwin/lib myprog.c -lX11
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

11

Lp trnh C/Linux

Xy dng th vin hm tnh (1)


// File name: hello.c #include <stdio.h> void hello(char * name) { printf("Hello %s\n",name); } // File name: bonjour.c #include <stdio.h> void bonjour(char *name) { printf("Bonjour %s\n",name); } //File name: mylib.h void hello(char * name); void bonjour(char *name);
22/10/2010

// File name: helloworld.c #include "mylib.h" int main() { hello("Hung"); bonjour("Hung"); return 0; } gcc -c *.c ls *.o bonjour.o hello.o helloworld.o gcc -o helloworld hello.o bonjour.o helloworld.o ./helloworld Hello Hung Bonjour Hung

Ng B Hng - http://sites.google.com/site/nbhung

12

Lp trnh C/Linux

Xy dng th vin hm tnh (2)


To tp tin th vin hm
ar crv libmylib.a hello.o bonjour.o

S dng th vin
gcc -o helloworld helloworld.o libmylib.a Hoc gcc -o helloworld helloworld.o -L. -lmylib

Tin ch nm: xem cc hm s dng trong mt chng trnh, th vin:


nm helloworld nm libmylib.a
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

13

Lp trnh C/Linux

Th vin hm chia s
Khc phc hn ch ca th vin hm tnh: cng mt hm nhng xut hin nhiu ni trong b nh my tnh khi c nhiu tin trnh cng tham kho n hm lm lng ph b nh Chng trnh s dng hm ca th vin hm chia s khng cha m code ca hm m cha m tham kho n hm Tin ch ldd: cho bit th vin chia s no cn bi mt chng trnh
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

14

Lp trnh C/Linux

Lp trnh C/Linux
Lp trnh C Cng c cn thit Trnh bin dch gcc Tp tin tiu Tp tin th vin hm Tin ch make Tp tin makefile Macro
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

15

Lp trnh C/Linux

Gii thiu tin ch make


L tin ch lp trnh Gip ngi lp trnh
Khng phi nh li cc cu lnh bin dch nhiu ln Trnh sai st khi nhp cc ty chn bin dch t bn phm Tit kim thi gian bin dch chng trnh v khng bin dch li cc tp tin ngun khng c sa i D dng phn phi phn mm di dng m ngun ngi ci t bin dch li khi ci t h thng
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

16

Lp trnh C/Linux

Tp tin m t
C tn mc nhin l makefile/Makefile c dng ch dn make cch thc bin dch/bin dch li mt cch t ng mt chng trnh; bao gm:
Cc mc tiu (targets): thng l cc tp tin thc thi hoc cc tp tin m i tng cn to ra Nhng s ph thuc (dependencies ) ch ra s ph thuc ca mt mc tiu vo cc tp tin khc Cc lut (rules) ch ra cch thc to ra cc mc tiu
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

17

Lp trnh C/Linux

Cch thc make hot ng


make bt u t mt mc tiu c yu cu trong tp tin m t Makefile Kim tra xem mc tiu hin ti c ph thuc vo cc mc tiu khc khng ? Nu c i xung mt cc qui cc mc tiu con Dch cc tp tin ngun thnh cc tp tin i tng, sau lin kt chng li thnh tp tin thc thi Ch dch li tp tin ngun thnh tp tin i tng khi tp tin ngun ny b sa i
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

18

Lp trnh C/Linux

M ngun ca mt ng dng
include a.h use prog1.c main.c

include include

use

b.h

include include prog2.c

c.h

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

19

Lp trnh C/Linux

Makefile cho ng dng


myapp: main.o prog1.o prog2.o
gcc -o myapp main.o prog1.o prog2.o

main.o: main.c a.h


gcc -c main.c

prog1.o: prog1.c a.h b.h


gcc -c prog1.c

prog2.o: prog2.c b.h c.h


gcc -c prog2.c
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

20

Lp trnh C/Linux

Cc mc tiu trong Makefile


myapp: main.o prog1.o prog2.o
gcc -o myapp main.o prog1.o prog2.o

main.o: main.c a.h


gcc -c main.c

prog1.o: prog1.c a.h b.h


gcc -c prog1.c

prog2.o: prog2.c b.h c.h


gcc -c prog2.c
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

21

Lp trnh C/Linux

Nhng s ph thuc trong Makefile


myapp: main.o prog1.o prog2.o
gcc -o myapp main.o prog1.o prog2.o

main.o: main.c a.h


gcc -c main.c

prog1.o: prog1.c a.h b.h


gcc -c prog1.c

prog2.o: prog2.c b.h c.h


gcc -c prog2.c
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

22

Lp trnh C/Linux

Cc lut trong Makefile


myapp: main.o prog1.o prog2.o
gcc -o myapp main.o prog1.o prog2.o

main.o: main.c a.h


gcc -c main.c

prog1.o: prog1.c a.h b.h


gcc -c prog1.c

prog2.o: prog2.c b.h c.h


gcc -c prog2.c
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

23

Lp trnh C/Linux

C php ca make
make
S dng tp tin makefile hoc Makefile trong th mc hin hnh nh tp tin m t To mc tiu u tin trong tp tin m t

make -f MyMakeFile
S dng tp tin MyMakeFile nh tp tin m t

make target-name
To mc tiu target-name trong tp tin m t Mc tiu all thng c nh ngha bao gm tt c cc mc tiu
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

24

Lp trnh C/Linux

Macro trong makefile


Macro cho php vit makefile mt cch tng qut v mm do hn, tng t nh vic s dng bin v hng trong lp trnh
C nhiu ty chn cho vic bin dch chng trnh: phin bn debug, phin bn pht hnh Thay i trnh bin dch ty thuc vo h thng

inh ngha macro:

MACRONAME=Value

Truy cp gi tr: $(MACRONAME), ${MACRONAME} hoc $MACRONAME


22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

25

Lp trnh C/Linux

all: myapp # Which compiler CC = gcc # Where are include files kept INCLUDE = . # Options for development CFLAGS = -g -Wall -ansi # Options for release # CFLAGS = -O -Wall -ansi myapp: main.o prog1.o prog2.o

V d makefile c s dng macro

$(CC) -o myapp main.o prog1.o prog2.o main.o: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c prog1.o: prog1.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c prog1.c prog2.o: prog2.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c prog2.c
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

26

Lp trnh C/Linux

Macro nh sn thng dng


$?: Danh sch cc tp tin ph thuc c sa i gn y hn so vi mc tiu hin hnh $@: Tn ca mc tiu hin hnh $<: Tn ca tp tin ph thuc hin hnh $*: Tn ca tp tin ph thuc hin hnh khng c phn m rng -cmd: B qua li khi thc thi cmd @cmd: yu cu make khng in cmd ra mn hnh trc khi thc thi n
22/10/2010 Ng B Hng - http://sites.google.com/site/nbhung

27

Lp trnh C/Linux

all: myapp CC = gcc # Where to install INSTDIR = /usr/local/bin # Where are include files kept INCLUDE = . # Options for development CFLAGS = -g -Wall -ansi # Options for release # CFLAGS = -O -Wall -ansi

nh ngha nhiu mc tiu


clean: -rm main.o prog1.o prog2.o install: myapp @if [ -d $(INSTDIR) ]; \ then \ cp myapp $(INSTDIR);\ chmod a+x $(INSTDIR)/myapp;\ chmod og-w $(INSTDIR)/myapp;\ echo Installed in $(INSTDIR);\ else \ echo Sorry, $(INSTDIR) does not exist;\ fi

myapp: main.o prog1.o prog2.o $(CC) -o myapp main.o prog1.o prog2.o main.o: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c prog1.o: prog1.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c prog1.c prog2.o: prog2.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c prog2.c
22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

28

Lp trnh C/Linux

Thc thi make vi nhiu mc tiu


$ rm *.o myapp $ make -f MyMakeFile gcc -I. -g -Wall -ansi -c main.c gcc -I. -g -Wall -ansi -c prog1.c gcc -I. -g -Wall -ansi -c prog2.c gcc -o myapp main.o prog1.o prog2.o $ make -f MyMakeFile make: Nothing to be done for all. $ rm myapp $ make -f MyMakeFile install gcc -o myapp main.o prog1.o 3.o Installed in /usr/local/bin $ make -f MyMakeFile clean rm main.o prog1.o prog2.o $

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

29

Lp trnh C/Linux

Nhng vn khc v make


Built-in rule
make -p

Suffix and Pattern Rules Managing Libraries with make Makefiles and Subdirectories

22/10/2010

Ng B Hng - http://sites.google.com/site/nbhung

30

You might also like