Thư viện liên kết Trang 3 Chương trình C Là một tập hợp của các : Khai báo và Định nghĩa Trang 4 Lập trình trên Linux4Ngôn ngữ C hỗ trợ rất tốt cho lập trình trên Linux.Tuy nhiên nók
Trang 1LẬP TRÌNH C TRÊN LINUX
Trang 2Nội dung
Trang 3Chương trình C
Là một tập hợp của các : Khai báo và Định nghĩa
Dành cho : Hàm, Biến, và kiểu Dữ liệu
Trang 4Lập trình trên Linux
4
Ngôn ngữ C hỗ trợ rất tốt cho lập trình trên Linux.Tuy nhiên nó không phải là lựa chọn duy nhất Có thể dùng Pascal , Assembler , Perl , Java , PHP, Python…
Chương trình Linux tồn tại trên hai dạng : thực thi ( file binary) giống như file *.exe trong DOS và thông dịch (script) giống như file *.bat Hai dạng file này có thể hoán đổi cho nhau Để chay
chương trình cần cấp quyền thực thi “x”
Cài biến môi trường : $echo $PATH
PATH = /bin:/user/bin:/user/local/bin:.
Trang 5Cộng đồng mã nguồn mở GNU
5
Cộng đồng GNU ( “Gnu is Not Unix”) đã xây dựng nhiều ứng dụng trên Unix (Linux) : Word proccessing, Office, Game, Multimedia, networking và các compiler , interpreter , programming languages…
GNU – Phi lợi nhuận song cần tuân thủ một số quy định về bản quyền của GNU - GPL (General Public License) – “copyleft”( thay cho “copyright”)
GNU cung cấp bộ biên dịch C/C++bao gồm :
Trang 6Lập trình C trên Fedora – điều kiện cần
3 công cụ cần thiết để viết lập trình trên ngôn ngữ C :
Trình soạn thảo ( text editor) : vi, gedit, emacs
$yum install emacs ( dưới quyền super user)
Trình biên dịch ( compiler) : GNU Compiler Collection (GCC), CC : đưa về mã đối tượng
$ gcc
$ which gcc
Thư viện chuẩn của C ( C standard library) : glibc
$ locate glibc
Trang 7"Hello, World!"Source Code
Trang 9Phân tích "Hello, World!"
Dòng đầu tiên trong ngôn ngữ C : preprossesordirective và luôn bắt đầu bằng dấu # khai báo thưviện
Trang 10Quá trình biên dịch
Quá trình biên dịch của gcc trải qua các bước sau:
Tiền xử lý (preprocessing) $gcc -E hello.c > hello.i
Biên dịch sang hợp ngữ(compiling) $gcc -S hello.i
Chuyển hợp ngữ sang mã máy (assembling) $gcc -c hello.s
Thiết lập các liên kết (linking) $gcc hello.o
preprocessing compiling assembling linking
Trang 11Quá trình biên dịch
Trang 12Tham số của gcc
Trang 13Phát triển chương trình trên ngôn ngữ c
Trình biên dịch gcc thường nằm trong /usr/bin hoặc
/usr/local/bin Khi biên dịch nó cần sự hỗ trợ của các file
C header trong /usr/include hoặc /usr/local/include
Các thư viện liên kết nằm trong /lib hoặc /usr/local/lib.
Các thư viện chuẩn của gcc nằm trong /usr/lib/gcc-lib
Chương trình nhị phân có thể nằm ở bất kỳ đâu song khithực thi ta cần chỉ đường dẫn thông qua biến môi trường
PATH
Trang 14 Nếu muốn tổ chức các header của riêng mình nằm ngoài thư mục
mặc định , ta phải chỉ rõ đường dẫn đến thư mục đó khi biên dịch
bằng tùy chọn –I như :
gcc –I/usr/mypro/include hello.c –o hello
Trang 15Header file
15
Khi sử dụng hàm nào đó của thư viện hệ thống, để biêthàm này được định nghĩa trong file header nào ta dùnglệnh man
Ví dụ hàm kill() $man 2 kill
Sử dụng hai file header
sys/types.h và signal.h
Trang 16Nội dung
1. Ngôn ngữ C
2. Minh họa Hello World và trình biên dịch
3. Thư viện liên kết
Trang 17Các file thư viện
17
Trong Linux các file thư viện có phần mở rộng là .a,
.so hoặc .sa và bắt đầu bằng lib
Ví dụ libutil.a ; libc.so
Hai loại liên kết thư viện:
Static Link Library (.a)
Dynamic Link Library(.so)
Dùng lệnh $ ls /usr/lib để xem các thư viện
Trang 18Các file thư viện
Trang 19Thư viện liên kết tĩnh
int cong( int a, int b )
Trang 20Thư viện liên kết tĩnh
Để chương trình gọi được các hàm trong thư việntrên, chúng ta cần tạo một tập tin header lib.h khaibáo các nguyên mẫu hàm gọi:
int cong( int a, int b );
long nhan( int a, int b );
lib.h #include <stdio.h>
#include "lib.h"
int main () {
}
program.c
Trang 21Thư viện liên kết tĩnh
Biên dịch và liên kết với chương trình chính :
$ gcc –c program.c # biên dịch
$ gcc program.o cong.o nhan.o –o program
Thực thi chương trình
$ /program
Trang 22Thư viện liên kết tĩnh
.o là các tập tin thư viện đối tượng
Tạo ra thư viện a từ các tập tin o ( tập nén) vào libfoo.a
$ ar cvr libfoo.a cong.o nhan.o # đóng gói
Sau khi đã có được thư viện libfoo.a, liên kết lại với
chương trình :
$ gcc program.o -o program libfoo.a
Trang 23Thư viện liên kết động
Nhược điểm của TVLK tĩnh : Nhúng mã nhị phân vàochương trình khi biên dịch
Khi thực thi, HDH sẽ chính thức nạp thư viện liên kếtcần thiết vào bộ nhớ Nhiều chương trình có thể sử dụngchung một DLL duy nhất
Thư viện liên kết động trong Linux có phần mở rộng so
Trang 24Thư viện liên kết động
Khi biên dịch tập tin đối tượng để đưa vào thư viện liên kết động, chúng ta phải thêm tùy chọn –fpic (PIC- Position Independence Code – mã lệnh vị trí độc lập)
Ví dụ : Biên dịch lại 2 tập tin cong.c và nhan.c
$ gcc -c -fpic cong.c nhan.c
$ gcc -shared nhan.o cong.o -o libfoo.so # tạo DLL
Trang 25Thư viện liên kết động
$ gcc program.c -o program -L -lfoo
Thực thi : $./program # báo lỗi
$ LD_LIBRARY_PATH=.:
$ export LD_LIBRARY_PATH
Trang 26Thư viện liên kết động
Kiểm tra xem Hệ Điều Hành có thể tìm ra tất cả các thư viện liên kết động mà chương trình sử dụng hay không:
$ ldd program
Trang 27Tương thích giữa Linux và Windows/DOS
func.o func.obj File đối tượng
lib.a lib.lib Static link lib
program program.exe Execute file
lib.so lib.dll Dinamic link lib
Trang 28Nội dung
1. Ngôn ngữ C
2. Minh họa Hello world và trình biên dịch
3. Thư viện liên kết
4. Makefile
Trang 29CÁC CÔNG CỤ QUẢN LÝ HỖ TRỢ LẬP TRÌNH
QUẢN LÝ NHIỀU MÃ NGUỒN :
Vấn đề nảy sinh khi phát triển những phần mềm lớn làphải biên dịch nhiều lần các mã nguồn Linux cung cấp
cho ta công cụ make.
Make còn được sử dụng rất nhiều trong việc quản lý gói, cài đặt , gỡ bỏ các ứng dụng
Có nhiều loại makefile khác nhau như phiên bản thử nghiệm (trial), phiên bản chính thức hay (beta), phiên bản dò lỗi (Debug).
Trang 30Tập tin makefile
Chương trình make không tự nó tạo ra các ứng dụng ,
nó phải được hướng dẫn , lập trình viên phải tạo ra
một file chứa thông tin hướng dẫn chương trình make
cách úng dụng sẽ được xây dựng và biên dịch File
chứa thông tin đó goi là makefile
Tập tin makefile thường đặc tả các phụ thuộc và các
quy tắc dẫn đến phụ thuộc :
Một phụ thuộc (dependences) gồm nhiều file liên quan đến nhau và cùng có một mục đích (target).
Quy tắc (rules) là các hướng dẫn hay quy định để các file
phụ thuộc tạo ra kết quả.
Thông thường file đích hay file kết quả là các file thư viện
.o hay out
Trang 31Xây dựng các phụ thuộc (dependences)
31
Các phụ thuộc xác lập mối quan hệ giữa các file nguồn
trong ứng dụng.Trong makefile ta xây dựng các phụ
thuộc bằng cách viết tên file đích đầu tiên , tiếp theo làdấu “:” Kế đến là các file phụ thuộc các nhau bằng
khoảng trắng hay “tab”.
Ví dụ :
myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
Trang 32Quy tắc
32
Sau khi xác định các phụ thuộc , ta cần chỉ rõ các quytắc hay cách thức tạo ra các file đích Quy tắc chính làcâu trả lời cho câu hỏi “phải làm gì để tạo ra file đích?”
$ gcc –c myapp
Cần lưu ý các quy tắc phải được ghi thụt đầu dòng vào
1 “tab” Cuối dòng cũng không để khoảng trắng Một sốtrình make sẽ không chịu diễn đạt quy tắc nếu cuốidòng có khoảng trắng
Trang 33Cú pháp sử dụng trong makefile
33
$make # tương đương với
$make makefile Hoặc $make –f makefile1
Các tham số và tùy chọn : Ba tùy chọn thông dụng nhất là
-k : yêu cầu make “cứ tiếp tục” chạy khi phát sinh lỗi thay vì
phải dừng khi có lỗi đầu tiên.
-n : yêu cầu make in ra các thao tác mà nó thực thi song không
thực thi các thao tác đó để xuất ra kết quả
-f <filename> : chỉ định tập tin mà make phải diễn dịch Nếu không có tùy chọn –f , trình make sẽ diễn dịch file có tên là
makefile hoặc Makefile ngay trong thư mục hiện hành nơi
chứa makefile
Trang 34Tab
Trang 35$ gcc -o hellomake hellomake.c hellofunc.c -I
$ gcc hellomake.c hellofunc.c -I.
Trang 36Makefiles 1
Trang 37ĐIỀU KHIỂN MACRO BẰNG makefile
Macro được sử dụng để thay đổi các tùy chọn khi áp dụng các quy tắc
biên dịch Make hỗ trợ các lệnh điều khiển các macro bên trong
makefile , giúp ta điều khiển các hoạt động của makefile uyển chuyển
hơn Hỗ trợ cho việc biên dịch, gỡ rối được được thuận lợi bằng cách tối ưu hóa các tùy chọn
Macro trong make được định nghĩa bởi cú pháp :
MACRO=value ; #MACRO rỗng nếu sau dấu “=” LÀ KHOẢNG TRẮNG
Để truy xuất giá trị của MACRO ta dùng cú pháp :
$(MACRONAME) hoặc $MACRONAME
Thường MACRO được định nghĩa trong chương trình , tuy nhiên nó có thể được định nghĩa trên dòng lệnh
Ví dụ khi cần định nghĩa trình biên dịch cần sử dụng là gcc ta viết CC=gcc Macro
được định nghĩa trên dòng lệnh có giá trị ưu tiên hơn được định nghĩa trong chương trình
Trang 38Một số quy tắc
%.o: %.c : xây dựng o từ c # tương đương với c.o
$@ : tên của target
$^ : danh sách phụ thuộc
$< : tên của phụ thuộc đầu tiên
$? : tập hợp các phụ thuộc mới hơn target
Trang 39Makefiles 2
Dùng 2 cờ :
CC : cho biết trình biên dịch nào sẽ thực hiện
CFLAGS :danh sách các cờ chúng ta cần để biên dịch
Trang 40Makefiles 3
Trang 41Lưu ý
Thư viện trong C
Cú pháp biên dịch
Make file