Tải bản đầy đủ (.pdf) (9 trang)

liên kết động và liên kết tĩnh trong lập trình nhúng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (168.87 KB, 9 trang )

Bộ 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)


A. 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.


1.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.



B. Ứ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.


Nội dung tập tin timsonguyento.c: default:
int songuyento(int a)
for (i=2;i{
{
int i;
if(a%i==0)
int dem=0;
{
switch (a)
dem=0;
{
break;
case 0:
}
dem=0;
else
break;
dem=1;

case 1:
}
dem=0;
}
break;
if (dem==0)
case 2:
return 0;
dem=1;
else
break;
return 1;
}


Nộ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;
}


1. 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


2. 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


Ta 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



×