Thư viện liên kết động

Một phần của tài liệu Báo Cáo LẬP TRÌNH HỆ THỐNG Đề Tài Hệ điều hành Linux (Trang 42)

III. Trình bày sự khác nhau trong cấu trúc điều khiển giữa 2 loại shell này

b.Thư viện liên kết động

i. Khái niệm thư viện liên kết động

Thư viện liên kết động là thư viện mà các hàm trong thư viện không được trực tiếp đưa vào chương trình lúc biên dịch và liên kết.

Trình liên kết chỉ lưu thông tin tham chiếu đến các hàm trong thư viện. Vào lúc chương trình thực thi, hệ điều hành sẽ nạp các chương trình liên kết cần tham chiếu vào bộ nhớ.

ii. Tạo thư viện liên kết động

Gồm 3 bước cơ bản:

Bước 1. Viết các hàm cho thư viện.(tương tự như thư viện liên kết tĩnh)

Bước 2. Tạo các file đối tượng “.o” từ các hàm vừa viết để đưa vào thư viện liên kết động ( sử dụng gcc với tùy chọn -fpic).

Bước 3. Tạo file thư viện liên kết động (“.so”, tiếp đầu ngữ “lib”) , từ các file đối tượng vừa tạo, sử dụng gcc với tùy chọn - shared.

Ví dụ: Tạo một thư viện liên kết động, chứa các hàm với chức năng như sau:

- nhap3so: cho nhập vào 3 số thực.

- gptb2: giải phương trình ax^2+bx+c=0, (a # 0) - nhapchuoi: cho nhập vào chuỗi kí tự.

- xulychuoi: định dạng cơ bản chuỗi kí tự.

Bước 1. Viết các hàm cho thư viện.

#include<stdio.h> float a,b,c;

void nhap3so() {

printf("Ham nhap 3 so thuc : \n"); printf("Nhap cac he so : \n"); printf("Nhap a:\n"); scanf("%f",&a); printf("Nhap b:\n"); scanf("%f",&b); printf("Nhap c:\n"); scanf("%f",&c); }

//end code nhap3so.c

gedit gptb2.c //code gptb2.c #include<stdio.h> #include<math.h> float a,b,c; void gptb2() { float x,x1,x2; float delta=b*b-4*a*c; if(delta>0) { x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a);

printf("Phuong trinh co 2 nghiem phan biet:\n"); printf("x1=%.2f , x2=%.2f ",x1,x2);

}

else if(delta==0) {

x=-b/(2*a);

printf("Phuong trinh co nghiem kep:\n"); printf("x1=x2=%.2f ",x);

} else {

printf("Phuong trinh vo nghiem !\n"); } } //end code gptb2.c gedit nhapchuoi.c //code nhapchuoi.c #include <string.h> #include <stdio.h> char s[100]; void nhapchuoi() {

puts("Ham nhap chuoi ki tu : \n"); puts("Nhap vao mot chuoi ki tu: \n"); while(getchar() != '\n');

gets(s); }

//end code nhapchuoi.c

gedit xulychuoi.c

#include<string.h> #include<ctype.h> #include<stdio.h> char s[100]; void xulychuoi() { int len_s,i,j; len_s=strlen(s);

printf("Do dai chuoi la %d\n",len_s); printf("\n"); //////////////////////////// for(i=0;i<len_s;i++) { if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32; } (adsbygoogle = window.adsbygoogle || []).push({});

puts("Chuyen doi chuoi thanh chu thuong\n"); puts(s); printf("\n"); ///////////////////////////// for(j=0;j<len_s;j++) { if(j==0) s[0]=toupper(s[0]); if(s[j]==32) s[j+1]=toupper(s[j+1]); }

puts("Viet hoa ki tu dau trong chuoi:\n"); puts(s);

///////////////////////////// for(j=0;j<len_s;j++) { if(s[j]>='a'&&s[j]<='z') s[j]=s[j]-32; }

puts("Chuyen doi chuoi thanh chu hoa:\n"); puts(s);

printf("\n"); }

//end code xulychuoi.c

Bước 2. Tạo các file đối tượng “.o” từ các hàm vừa viết để đưa vào thư viện liên kết động ( sử dụng gcc với tùy chọn -fpic).

gcc -c -fpic nhap3so.c gptb2.c nhapchuoi.c xulychuoi.c

Bước 3. Tạo file thư viện liên kết động (“.so”, tiếp đầu ngữ “lib”) , từ các file đối tượng vừa tạo, sử dụng gcc với tùy chọn -shared.

gcc -shared nhap3so.o gptb2.o nhapchuoi.o xulychuoi.o -o libdynamic.so

(trong đó “libdynamic.so” là tên thư viện liên kết động)

Ứng dụng thư viện liên kết động libdynamic.so:

1. Viết chương trình giải phương trình bậc hai. 2. Viết chương trình tổng hợp:

- Giải phương trình bậc hai - Xử lý chuỗi cơ bản

1. Chương trình giải phương trình bậc hai

a. Tạo file và viết code chương trình chính

gedit main_gpt2.c

//code main_gpt.c

nhap3so(); gptb2(); }

//end code main_gpt2.c

b. Biên dịch chương trình sử dụng thư viện liên kết động libdynamic.so

gcc main_gpt2.c -o main_gpt2 -L. -ldynamic -lm

Tùy chọn -L. -ldynamic : chỉ ra cho trình liên kết tìm đến thư viện dynamic trong thư mục hiện hành để lưu thông tin tham chiếu các hàm dùng trong chương trình chính.

c. Chạy file thực thi vừa tạo

- Định đường dẫn biến môi trường chỉ đến thư mục hiện hành – nơi chứa thư viện libdynamic.so cần tham chiếu.

LD_LIBRARY_PATH=.: export LD_LIBRARY_PATH

- Chạy file thực thi:

./main_gpt2

2. Chương trình tổng hợp

- Xử lý chuỗi kí tự cơ bản nhập từ bàn phím - Giải phương trình bậc hai: ax^2+bx+c=0, (a#0) (adsbygoogle = window.adsbygoogle || []).push({});

a. Tạo file và viết code chương trình chính

gedit main_th2.c //code main_th2.c #include <stdio.h> #include <string.h> void main(void) { int choice; char exit; do {

printf("Menu Chuong Trinh\n"); printf("1) Xu ly chuoi ky tu\n");

printf("2) Giai phuong trinh ax^2+bx+c=0\n"); printf("3) Thoat chuong trinh\n");

printf("Lua chon yeu cau : \n"); scanf("%d",&choice); switch(choice) { case 1: nhapchuoi(); xulychuoi(); break; case 2: nhap3so(); gptb2(); break; case 3: break;

default : printf("Phai nhap 1, 2 hoac 3\n"); };

printf("Thoat chuong trinh ? (y/n)\n"); while(getchar() != '\n');

scanf("%c",&exit); }while(exit == 'n'); }

//end code main_th2.c

b. Biên dịch chương trình sử dụng thư viện liên kết động libdynamic.so

gcc main_th2.c -o main_th2 -L. -ldynamic -lm

c. Chạy file thực thi vừa tạo

./main_th2

Ưu điểm:

o File thực thi của chương trình chính không chứa mã thực thi của các hàm trong thư viện.

o Nhiều chương trình khác nhau có thể cùng dùng chung một thư viện duy nhất.

- Chương trình sử dụng thư viện liên kết động không phải được biên dịch lại mà vẫn có thể sử dụng những tính năng mới của thư viện (trong trường hợp thư viện đó được sửa đổi, nâng cấp).

Khuyết điểm:

- Chương trình sử dụng thư viện liên kết động không thể chạy độc lập với thư viện – chương trình phụ thuộc hoàn toàn vào thư viện.

- Hạn chế khi muốn sửa đổi hoặc nâng cấp: Khi muốn sửa đổi hoặc thêm hàm cho thư viện, vẫn phải thực hiện lại các bước như khi tạo thư viện ban

đầu(tương tự thư viện liên kết tĩnh).

Kết luận về ưu, nhược điểm trong việc lập trình ngôn ngữ C trên Linux sử dụng thư viện liên kết động và liên kết tĩnh :

Kích thước file thực thi:

Xem lại các chương trình trong 2 video trước, cùng một mã nguồn nhưng việc sử dụng loại thư viện liên kết khác nhau dẫn đến kích thước file thực thi khác nhau: chương trình sử dụng thư viện liên kết tĩnh luôn có kích thước file lớn hơn chương trình sử dụng thư viện liên kết động.

File thực thi Thư viện liên kết tĩnh Thư viện liên kết động

main_gpt 7.2KB 7.0KB

main_th 7.5KB 7.2KB

Khả năng độc lập của chương trình thực thi với thư viện:

o Chương trình sử dụng thư viện liên kết tĩnh có khả năng chạy độc lập với thư viện sau khi được biên dịch.

o Chương trình sử dụng thư viện liên kết động phụ thuộc vào thư viện, không thể chạy độc lập với thư viện. (adsbygoogle = window.adsbygoogle || []).push({});

o Do tính độc lập của chương trình sử dụng thư viện liên kết tĩnh nên nếu muốn chỉnh sửa chương trình ứng dụng thì cần phải biên dịch lại chương trình cùng với thư viện mà nó liên kết.

o Chương trình sử dụng thư viện liên kết động có thể tận dụng trực tiếp ngay những sự thay đổi của thư viện mà nó liên kết, không cần phải được biên dịch lại.

Nói tóm lại, ta có bảng sau:

Chương trình ứng dụng Thư viện liên kết tĩnh Thư viện liên kết động

Kích thước Lớn Nhỏ

Tính độc lập Có Không

Khả năng chỉnh sửa, nâng cấp Hạn chế Hỗ trợ

Tùy vào mục đích, khả năng, quy mô cũng như phạm vi chương trình ứng dụng mà người lập trình cần cân nhắc trong việc lựa chọn sử dụng loại thư viện liên kết cho phù hợp nhất.

Một phần của tài liệu Báo Cáo LẬP TRÌNH HỆ THỐNG Đề Tài Hệ điều hành Linux (Trang 42)