Đây là hai ứng dụng liên kết động và liên kết tĩnh trong lập trình nhúng có kèm theo code và hướng dẫn cụ thể. Các bạn làm đồ án nhất định sẽ cần đến.
Trang 1Bộ môn: ĐIỆN TỬ VIỄN THÔNG
BÁO CÁO MÔN HỌC HỆ THỐNG NHÚNG
ỨNG DỤNG LIÊN KẾT TĨNH ỨNG DỤNG LIÊN KẾT ĐỘNG Giảng viên hướng dẫn: TS Võ Minh Huân Sinh viên thực hiện: Đinh Việt Hòa (Nhóm 19)
Trang 2A Khái niệm:
Thư viện là tập hợp các chương trình con cho phép mã nguồn của
nó được chia sẻ
Các chương trình chính chạy và liên kết với các thư viện theo một tiến trình gọi là linking (liên kết), làm việc qua một trình liên kết (linker)
Thư viện chia làm 2 loại:
thư viện liên kết tĩnh và thư viện liên kết động
Trang 31.Thư viện liên kết tĩnh (Static link library):
Là tập hợp các file object tạo thành một file đơn nhất
Theo quy ước, các file này có đuôi kết thúc là *.a trong UNIX, tương
tự file LIB trên Windows
Khi biên dịch, trình biên dịch sẽ lấy toàn bộ mã nguồn của hàm trong thư viện đưa vào chương trình chính
2 Thư viện liên kết động (Dynamic link library):
Mã nguồn trong thư viện này không được đưa trực tiếp vào chương trình chí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 mã nguồn trong thư viện
Trang 4B Ứng dụng liên kết tĩnh - Ứng dụng liên kết động:
Để minh họa cách sử dụng thư viện liên kết tĩnh và động, ta sẽ xây dựng chương trình tìm số nguyên tố từ 0 đến a, với a là số nguyên
dương do người dùng nhập
Ứng dụng này gồm 2 tập tin: tập tin timsonguyento.c chứa hàm tìm
số nguyên tố và tập tin main.c để gọi hàm chứa trong tập tin
timsonguyento.c.
Trang 5Nội dung tập tin timsonguyento.c:
int songuyento(int a)
{
int i;
int dem=0;
switch (a) {
case 0:
dem=0;
break;
case 1:
dem=0;
break;
case 2:
dem=1;
break;
default:
for (i=2;i<a;i++) {
if(a%i==0) {
dem=0;
break;
}
else dem=1;
} }
if (dem==0)
return 0;
else
return 1;
}
Trang 6Nội dung tập tin main.c:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,i;
int dem=0;
printf("Nhap so a vao: ");
scanf("%d",&a);
if (a<2)
printf(“Khong co SNT <2 \n”);
else
{
printf("\n -\n");
printf("Day so nguyen to tu 0
den %d la: ",a);
for(i=0;i<=a;i++) {
dem=songuyento(i);
if (dem==1) printf("%d, ",i);
} printf("\n -\n"); }
return 0;
}
Trang 71 Biên dịch và sử dụng thư viện liên kết tĩnh :
Ta sẽ biên dịch tập tin timsonguyento.c thành thư viện, sau đó liên kết thư viện này vào chương trình chính ở tập tin main.c.
Bước 1: Biên dịch tạo file object từ tập tin timsonguyento.c
$ gcc –c timsonguyento.c
Bước 2: Để tạo thư viện liên kết tĩnh libtimSNT.a từ tập tin
timsonguyento.c ta dùng lệnh ar.
$ ar cr libtimSNT.a timsonguyento.o
Bước 3: Biên dịch có liên kết (link) đến thư viện tĩnh
libtimSNT.a
$ gcc –o main main.c libtimSNT.a
Bước 4: Chạy chương trình:
$ /main
Trang 82 Biên dịch và sử dụng thư viện liên kết động :
Bước 1: Biên dịch tạo các file object có dùng tùy chọn –fPIC
$gcc -c –fPIC timsonguyento.c
Bước 2: Tạo thư viện liên kết động tên là libtimSNT.so
$gcc -shared –fPIC -o libtimSNT.so timsonguyento.o
Bước 3: Biên dịch tập tin main.c có liên kết (link) đến thư viện động libtimSNT.so
$gcc -o main main.c libtimSNT.so
Bước 4: Chạy chương trình: $ /main
Chương trình báo lỗi
Nguyên nhân: do loader tìm trong thư mục thư viện chuẩn
như /usr/lib, /lib không có tập tin libtimSNT.so.
Giải pháp: Ta sử dụng lệnh ldd để kiểm tra xem chương trình
main của chúng ta cần những thư viện gì
$ldd main
Trang 9Ta phải thay đổi biến môi trường LD_LIBRARY_PATH để chỉ cho loader tìm trong thư mục chứa thư viện
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
Sau đó ta chạy lại chương trình:
$./main