Thư viện liên kết tĩnh

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 34)

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

a. Thư viện liên kết tĩnh

i. Khái niệm thư viện liên kết tĩnh

Thư viện liên kết tĩnh là các thư viện khi liên kết trình biên dịch sẽ lấy toàn bộ mã thực thi của các hàm trong thư viện đưa vào chương trình chính.

ii. Tạo thư viện liên kết tĩnh

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

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

Bước 3. Nén các file đối tượng vừa tạo thành một file thư viện “.a”, tiếp đầu ngữ “lib”.

Ví dụ: Tạo một thư viện liên kết tĩnh, 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

gedit nhap3so.c //code nhap3so.c #include<stdio.h> void nhap3so() { float a,b,c;

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> void gptb2()

{ float a,b,c; 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 //code 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; }

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); printf("\n"); ///////////////////////////// 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.

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

Bước 3. Nén các file đối tượng vừa tạo thành một file thư viện “.a”, tiếp đầu ngữ “lib”. Vd: libstatic.a

ar cvr libstatic.a nhap3so.o gptb2.o nhapchuoi.o xulychuoi.o

Ứng dụng thư viện liên kết tĩnh libstatic.a :

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:

- 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 tiêu đề “.h” - khai báo thuộc tính cho các hàm sử dụng trong chương trình.

gedit header_gpt.h

//code header_gpt.h

void nhap3so(); void gptb2();

//end code header_gpt.h

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

gedit main_gpt.c //code main_gpt.c #include "header_gpt.h" void main(void) { nhap3so(); gptb2(); }

//end code main_gpt.c

c. Biên dịch chương trình chính liên kết với thư viện tĩnh libstatic.a

gcc main_gpt.c -o main_gpt libstatic.a -lm

d. Thực thi chương trình

./main_gpt

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

- Giải phương trình bậc 2: ax^2+bx+c =0 (a#0)

- Xử lý chuỗi cơ bản

a. Tạo file tiêu đề “.h”- khai báo thuộc tính cho các hàm sử dụng trong chương trình

gedit header.h //code header.h

void nhap3so(); void gptb2(); void nhapchuoi(); void xulychuoi(); //end code header.h

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

gedit main_th.c //code main_th.c #include <stdio.h> #include <string.h> #include "header.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_th.c

c. Biên dịch chương trình chính liên kết với thư viện tĩnh libstatic.a

gcc main_th.c -o main_th libstatic.a -lm

d. Thực thi chương trình

./main_th

Ưu điểm: Chương trình sử dụng thư viện liên kết tĩnh có thể chạy độc lập với thư

viện sau khi được biên dịch – chạy được trên các máy tính khác nhau.

Nhược điểm:

- Tốn không gian ổ đĩa:

o Toàn bộ mã thực thi của các hàm trong thư viện sẽ được nhúng vào file thực thi của chương trình chính.

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

o Có những hàm trong thư viện mà chương trình chính không dùng đến cũng được liên kết với chương trình chính khi biên dịch.

- Hạn chế trong việc sửa đổi, nâng cấp thư viện liên kết tĩnh và các chương trình sử dụng thư viện liên kết tĩnh đó:

o Khi muốn sửa đổi hoặc nâng cấp thư viện thì phải thay đổi hoặc thêm mã nguồn cho các hàm trong thư viện, dẫn đến việc phải biên dịch lại từ đầu mã nguồn để tạo ra file thư viện “.a”.

o Chương trình sử dụng thư viện liên kết tĩnh nếu muốn tận dụng những tính năng mới của thư viện thì cũng phải được biên dịch lại.

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 34)

Tải bản đầy đủ (PDF)

(57 trang)